Javascript JSHINT严格冲突函数表达式与函数声明

Javascript JSHINT严格冲突函数表达式与函数声明,javascript,gulp,jshint,Javascript,Gulp,Jshint,我很难绕过JSHINT,抱怨使用this关键字作为可能的严格违规行为 最初我有这个简单的原型模式,我使用的是函数声明。在这种情况下,JSHINT抛出可能的严格违规 (function (ns) { 'use strict'; ns.EventData = function (eventData) { this.id = eventData.id; this.name = eventData.name; }; ns

我很难绕过JSHINT,抱怨使用
this
关键字作为
可能的严格违规行为

最初我有这个简单的原型模式,我使用的是
函数声明
。在这种情况下,JSHINT抛出
可能的严格违规

(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));
然而,当我切换到
函数表达式
时,一切正常。有人能解释为什么会有不同吗

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));
但是你不能这样做:

  (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看到您在函数声明中使用
时,它将警告您,因为解释器可能会将该函数移动到不同的上下文中,并且您可能对
具有不同的值


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

这可能对您有所帮助。事实上,有一个答案指向我为解决这个问题而遇到的相同解决方案,但不清楚是什么造成了如此大的差异,这就是我的问题。