簡體   English   中英

JSHINT嚴格違反函數表達式與函數聲明

[英]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具有不同的價值。

這只是一個警告,理論上可能會發生類似的事情,但是在大多數情況下,您對名稱空間和上下文非常有把握,因此請忽略它;)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM