2014-09-19 31 views
2

我有一個非常混亂的局面......這些是如何引用相同的變量?

(function sayStuff(){ 
    this.word = "hello2"; 
    (function(){ 
     console.log(this.word); 
    }()) 
}()) 


var myObject = { 
    word: "bar", 
    func: function() { 
     (function() { 
      console.log(this.word); 
     }()); 
    } 
}; 
myObject.func(); 

輸出

hello2 hello2

怎麼會這樣呢? myObject的'func'上的閉包如何看到sayStuff()中引用的變量?我認爲IIFE是爲了保護內部不受全球影響?

+0

但他告訴我我必須要耐心等待8分鐘,因爲我的學習沒有登錄。謝謝! – Exitos 2014-10-06 12:59:16

回答

5

在這兩種情況下,thiswindow,全局默認上下文替換您在調用內部函數表達式時不提供的全局默認上下文。

如果你想保留的情況下,不要在內部使用IIFE或與上下文打電話給他們:

(function sayStuff(){ 
    this.word = "hello2"; // still this is window, use var if you don't want that 
     (function() { 
      console.log(this.word); // window.word 
     }).call(this); // well, this is window... 
}()) 


var myObject = { 
    word: "bar", 
    func: function() { 
     (function() { 
      console.log(this.word); // myObject.word 
     }).call(this); 
    } 
}; 
myObject.func(); 
2

IIFE只能躲在局部範圍的變量(即與var關鍵字創建的那些)。

你的所有函數,觸摸this.word在全局上下文中調用(即,不作爲對象的方法,不與new關鍵字,而不是與applycallbind),所以this在每種情況下window。你正在處理全局變量。

如果你想要一個私有變量,你會做更多的事情是這樣的:我想

(function(){ 
    var word = "hello2"; 
    (function(){ 
     console.log(word); 
    }()) 
}())