JSHINT 严格违反函数表达式 vs 函数声明

Posted

技术标签:

【中文标题】JSHINT 严格违反函数表达式 vs 函数声明【英文标题】:JSHINT strict violation function expression vs function declaration 【发布时间】:2016-06-18 02:06:33 【问题描述】:

我无法绕过 JSHINT 抱怨将 this 关键字用作 possible strict violation

最初我有这个简单的原型模式,我使用的是function declaration。在这种情况下,JSHINT 抛出 possible strict violation

(function (ns) 
    'use strict';

    ns.EventData = function (eventData)         
        this.id = eventData.id;
        this.name = eventData.name;
    ;

    ns.EventData.prototype = (function ()         
        return 
            getDate: getDate            
        ;
        // function declaration
        function getDate() 
            return ns.utils.formatDate(this.date);
        ;

    ());
(window.myProject));

但是,当我切换到 function expression 时,一切正常。谁能解释为什么有区别?

ns.EventData.prototype = (function () 
    // function expression
    var getDate = function () 
        return ns.utils.formatDate(this.date);
    ;

    return 
        getDate: getDate            
    ;
());

【问题讨论】:

这可能对你有帮助***.com/questions/7688765/… 不是真的,有一个答案指向我遇到的解决问题的相同解决方案,但不清楚是什么造成了如此不同,这是我的问题。 【参考方案1】:

问题是,当您使用函数声明时,您可以将其放置在您想要的任何位置。在声明之前调用函数没关系,它会在内存中可用,并且不会出错。这就是 javascript 的解释方式。

表达式不是这样。表达式需要在调用之前执行(它是表达式,所以有意义)。例如,您可以这样做:

  (function (ns) 
      'use strict';

      test();

      function test() 
          console.log('Test');
      

  (window.myProject));

但你不能这样做:

(function (ns) 
    'use strict';

    test();

    var test = function() 
        console.log('Test');
    

(window.myProject));

我认为这是两者之间的唯一区别。 Javascript 解释器将找到并移动范围顶部的所有声明(在您的情况下为 (function (ns) ...),这就是 JSHint 抱怨的原因。

结论,当 JSHint 看到你在函数声明中使用 this 时,它会警告你,因为解释器可能会将该函数移动到不同的上下文,并且你可能会对 this 有不同的值。

这只是一个警告,理论上可能会发生类似的事情,但在大多数情况下,您对命名空间和上下文非常确定,因此请忽略它;)

【讨论】:

以上是关于JSHINT 严格违反函数表达式 vs 函数声明的主要内容,如果未能解决你的问题,请参考以下文章

d3.js on event + jshint 可能严格违反

Jshint.com |分配给“这个”

如何正确解决这个 JSHint “可能的严格违规”

函数声明vs 函数表达式

详解函数声明VS函数表达式

函数表达式