3

通知下面的閉合例如:當在JavaScript調用關閉,在進入封閉代碼時創建了一個新的執行環境?

<script> 
    function foo() { 
    var x = 1; 
    function bar() { 
     var y = 2; 
     alert(x + y); 
    } 
    return bar; 
    } 

    var dummy = foo(); // Assign variable binding "dummy" to a reference of the "bar" function. 
    dummy(); // When entering the "bar" function code, will it go through the execution context creation phase? 
</script> 

當調用虛擬變量結合(將執行「欄中的」功能碼),是一個新的執行上下文中創建的? ECMAScript規範規定,當entering function code會發生什麼,但由於這是一個函數/閉包的參考,我不知道,如果它不得不再次經歷整個執行上下文創建/粘結相。

回答

0

我覺得作用域鏈是你正在尋找這裏的東西:

http://www.amazon.com/JavaScript-Definitive-Guide-Activate-Guides/dp/0596805527/ref=sr_1_2?ie=UTF8&qid=1362066219&sr=8-2&keywords=javascript(3.10.3)

每次被調用的函數,它會創建一個新的對象來存儲它的局部變量和將該新對象添加到存儲的作用域鏈中以創建代表該函數調用作用域的新的更長的鏈。

對於你的問題是它會再次在整個執行上下文去,否則你如何從巴()返回另一個函數一樣

function bar() { 
     var y = 2; 
     alert(x + y); 

return function() {alert('hello');} 
    } 
2

好問題。讓我們來看看這是怎麼回事:

dummy()是FUNC一個Function Call (11.2.3)

見步驟#8 「返回調用的結果[[呼叫]]內部方法,提供thisValue作爲this值並提供列表argList作爲參數值。「

所以dummy.[[Call]]被調用。移動到13.2.1[[Call]])。

假設funcCtx是使用F的[[FormalParameters]]內部屬性值,傳遞的參數List args和此值(如10.4.3中所述)爲函數代碼建立新的執行上下文的結果。

所以dummy()做實際上創建新的執行上下文關係中10.4.3描述。

現在dummy的功能代碼被執行,NewDeclarativeEnvironment作爲每個步驟#5在10.4.3創建傳遞dummy.[[Scope]]

dummy僅僅是bar的引用,所以dummy.[[Scope]]bar.[[Scope]]。並且bar.[[Scope]]foo執行時(早一行)定義,自然創建每個函數聲明(包括bar)中的函數。

bar.[[Scope]]本質上是由[global environment][foo VE](可變環境)組成的鏈。所以在執行時它會創建自己的VE並使用foo的VE作爲外部。範圍鏈現在由[global environment]->[foo VE]->[bar VE]組成。

x在變種的發現VE,y在酒吧的發現VE和警報成功接收3作爲參數:)

但是,爲了回答你原來的問題,是「輸入功能碼」發生在

情況
(function(){ ... })(); 

並在

f(); 

情況下,由於兩者基本上大呼過癮ction的[[Call]]。這只是第一個是CallExpression,它由FunctionExpression後跟Arguments,而第二個爲CallExpression,它由Identifier後跟Arguments組成。

兩個仍然解析爲一個函數對象,它具有內部[[Call]]方法,這是執行的內容。