2013-11-04 97 views
0

我學習JavaScript,我不明白爲什麼此代碼的工作:JavaScript變量的生命週期

function getObj() 
{ 
    var objAddress = 
    { 
     address: "Client Address", 
     getAddress: function() { 
     return this.address; 
     }, 
     setAddress: function(newAddress) 
     { 
     this.address = newAddress; 
     } 
    }; 

    var objClient = 
    { 
     name: "Client name", 
     getAddress: function() 
     { 
     return objAddress.getAddress(); 
     }, 
     setAddress: function(newAddress) { 
     objAddress.setAddress(newAddress); 
     } 
    }; 

    return objClient; 
} 

gObj = getObj(); 
console.log(gObj.getAddress()); // Will print "Client Address" 
gObj.setAddress("xpto"); 
console.log(gObj.getAddress()); // Will print "xpto" 

我認爲這是行不通的,因爲getAddress()調用的對象,不應該離開功能之後存在的另一種方法。但是,因爲這是行得通的,所以我認爲即使在退出getObj函數之後,對象objAddress仍然存在。

功能之外,gObj.getAddress()如何工作?

+2

閱讀關於閉包,它們非常重要。 –

+1

是什麼讓你覺得'getAddress()'調用方法不存在? – JJJ

+0

我來自C/C++,我認爲,在return語句之後,函數的所有局部變量都將被刪除。所以,objAddress也會被取消。 – javlacerda

回答

0

這被稱爲封閉。從the MDN page

來自閉包父函數的變量仍然與父級的範圍相綁定。 (link

也就是說,隨着於它們在所定義的範圍的參照存在的功能。只要與至範圍的參考函數存在,則範圍將存在。

0

getObj是關閉和這裏:

gObj = getObj(); 

gObj是封閉的一個實例,所以在這個類中定義的所有功能和特性的有效期爲oObj了。

0

當你創建使用局部變量的函數時,函數「記住」這個局部變量。所有需要的局部變量都存儲在稱爲閉包的特殊對象中。你不能直接訪問它,但功能可以。 JavaScript調試中的Chrome開發人員工具顯示閉合對象:Closure in Chrome Developer Tools