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

时间:2016-03-04 11:00:01

标签: javascript gulp jshint

我无法绕过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            
    };
}());

1 个答案:

答案 0 :(得分: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的不同值。

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