2013-04-12 192 views
0

更新:重寫問題,因爲原來的問題有錯誤的假設(我在一個控制檯中運行代碼,已經初始化了我認爲未定義的變量)。JavaScript:初始化對象後初始化內部變量

這是有道理的:

var obj = { 'whichScope': a }; 
obj.whichScope; //"ReferenceError: a is not defined" 

但後來怎麼會在下一個例子不會拋出一個錯誤?如果第二行在第一行之前運行,爲什麼obj.whichScope沒有解析爲「After」?

var obj = { 'whichScope': a }; 
var a = "After"; 
obj.whichScope; //"undefined" 

如果obj初始化之前「VAR一」在前面的例子中運行時,確實的任何部分「A =‘後’;」在obj被初始化之前也運行?

var a = "Before"; 
var obj = { 'whichScope': a }; 
a = "After"; 
obj.whichScope; //"Before" 

如果whichScope引用返回'a'的函數,那麼它在上一個例子中確實解析爲「After」。

回答

1

這就是所謂的變量提升。

參考文獻:

變量(與var聲明)和功能提升到其範圍的頂部。

所以從技術上講,你的腳本是這樣的:

var a; // = undefined 
var obj = { 'whichScope': a }; 
a = "After"; 

雖然你的第一個例子沒有你說什麼。如預期的那樣,obj.whichScope的值是undefined

DEMO:http://jsfiddle.net/pRQwK/

至於你的最後一句話,If whichScope refers to a function that returns 'a' then it does resolve to "After" in the second example. - 這是因爲a值不是(由封閉)抓獲。設置屬性時,它的值立即被捕獲(與閉包無關)。