2016-09-14 19 views
0

謝謝你的幫助。簡單示例中執行上下文的外觀如何

在一類我以我曾經碰到過下面的代碼:

var carlike = function(obj, loc){ 
    obj.loc = loc; 
    obj.move = move; 
    return obj; 
}; 

var move = function(){ 
    this.loc++; 
}; 

var ben = carlike({}, 9); 

這是我的理解是,當功能carlike是在其執行環境變量的創建階段的最後一行調用move設置爲undefined。所以我的問題是:在哪一點是move設置等於function() {this.loc++;};?我發現這是令人困惑的,因爲移動函數是在carlike函數之後定義的。那麼carlike如何在它後面訪問環境。

我真的想知道這是如何工作的引擎蓋下的執行上下文的條件,範圍等

有些事情我已閱讀,試圖明白這一點:

http://dmitrysoshnikov.com/ecmascript/chapter-1-execution-contexts/ http://corporate.tuenti.com/en/dev/blog/functions-and-execution-contexts-in-javascript-2

+0

編譯器通過和執行是不同的事情,可能採取不同的路徑。 JS中的編譯器通過頂部的代碼並驗證變量和其他一些東西......變量「邏輯上」移動到其範圍的頂部並設置爲可用,這就是爲什麼移動可用作變量它的範圍,但obj.move是爲對象obj聲明的不同變量,並分配了「全局」移動的值。 –

回答

0

它具有對那個移動變量的訪問,因爲雖然函數移動是在函數carlike之後聲明的,但是在移動已經聲明之後,carlike不引用移動,因爲carlike在移動被定義爲函數之後調用。如果您在移動的定義之上打電話給carlike,那麼移動將被設置爲undefined,因爲該功能尚不存在。

+0

然而這與我所讀到的關於詞彙範圍的內容不符。引用一本關於該主題的知名書籍:「無論函數從哪裏被調用,甚至是如何被調用,它的詞法範圍都只能由函數聲明的位置來定義」。 – Yapartase