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

JSHINT strict violation function expression vs function declaration

我无法解决 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            
    };
}());

事情是当你使用函数声明时你可以把它放在任何你想要的地方。如果在声明之前调用函数并不重要,它将在内存中可用,并且不会出错。 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 值。

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