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

JSHINT strict violation function expression vs function declaration

本文关键字:函数 声明 表达式 反函数 JSHINT      更新时间:2023-09-26

我很难绕过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值。

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