2017-09-14 52 views
1

我想可以肯定,http://eloquentjavascript.net/10_modules.html,例如:EloquentJavaScript - 通過此關鍵字引用不起作用?



    (function(exports) { 
     var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
        "Thursday", "Friday", "Saturday"]; 

     exports.name = function(number) { 
     return names[number]; 
     }; 
     exports.number = function(name) { 
     return names.indexOf(name); 
     }; 
    })(this.weekDay = {}); 

    console.log(weekDay.name(weekDay.number("Saturday"))); 
    // → weekDay not defined 

,當我在提到網站上運行的工作,但是當我嘗試做同樣的VS代碼(+ Node.js的調試),它說weekDay未定義。我已經發現原因是這個關鍵字不是引用保存整個代碼的對象,而是指保存調用該函數的對象的對象,所以我試過這個:

(function(exports) { 
    var names = ["Sunday", "Monday", "Tuesday", "Wednesday", 
       "Thursday", "Friday", "Saturday"]; 

    exports.name = function(number) { 
     return names[number]; 
    }; 
    exports.number = function(name) { 
     return names.indexOf(name); 
    }; 
    })(weekDay = {}); 

    console.log(weekDay.name(weekDay.number("Saturday"))); 
// → Saturday 

它的工作原理,任何人都可以解釋爲什麼? IMO傳遞的參數不被視爲函數變量,而是屬於調用該函數的對象的變量(但爲什麼從書上的代碼在網站上工作呢?)。

回答

1

首先,不要對不瞭解this感到不好。這很混亂。

此總結this得不錯:

https://github.com/getify/You-Dont-Know-JS/blob/master/this%20%26%20object%20prototypes/ch1.md#review-tldr

道具老師凱爾。

My TL; DR:您在節點中調用的this綁定到文件中運行的代碼。您在瀏覽器中調用的this綁定到window對象,這是一個瀏覽器中可用的特殊對象,超過了過去的超級用戶。 ;)

還記得this是一個綁定,當一個函數被調用時,它引用它完全依賴於調用該函數的調用站點。

在示例沙箱(從瀏覽器的全局範圍調用)中,this指的是瀏覽器的window對象。 window是瀏覽器的全局對象。它包含所有的全局變量。您的呼叫站點是全球範圍。

最簡單的說,每個節點文件運行在它自己的氣泡中。每個文件都有自己的this,呼叫站點是泡泡。全局範圍內的變量不會自動在節點模塊中掛在this之下。

還有一個插件:讀凱爾的書。去上一堂課。他是一位了不起的老師。