1

static scoping,可以通過分析/解析源代碼來確定標識符(相對於動態範圍,或多或少需要知道調用者環境)。我的問題是這樣的,因爲靜態範圍只需要解析源代碼來知道範圍和標識符綁定,是在編譯時作出的範圍環境/標識符綁定,還是當每個函數(或新的範圍)被訪問。在靜態(詞法)範圍內,變量/聲明標識符何時綁定?

JavaScript示例:

var globalVar; 
function fooFunc() { 
    var fooVar; 
    function barFunc() { 
    var barVar; 
    } 
} 

在這個簡單的JavaScript例如,我可以肉眼檢查該barFunc環境將具有barVar的可變程序確定,並具有具有fooVar以及父環境作爲barFunc函數,並且具有globalVar全局範圍的父環境。我很好奇,如果編譯器/解釋器作爲一個整體讀取源代碼並進行綁定,或者如果這些確定是通過函數(或作用域範圍)在函數上進行的話。

如果我不清楚,請告訴我。

謝謝你,

編輯:雖然我的例子是在JavaScript中(我敢particularlly好奇),我也很好奇,如果這個不同(即JavaScript中,C/C++語言之間,C#/ VB等)

回答

0

在JavaScript中,範圍僅在函數被調用時創建。因此,儘管您的示例在全局範圍中聲明的函數內部具有函數,但僅存在全局範圍。

在調用fooFuncbarFunc之前,fooFunc範圍和barFunc範圍不存在。由於他們從未被稱爲全球範圍是該計劃的唯一範圍。哦,並且barFunc甚至不存在,因爲fooFunc從未被調用過。

當您在JavaScript中調用函數時,會爲其創建一個新的執行上下文。執行上下文可以被認爲是函數的範圍。看到這個答案的詳細信息:https://stackoverflow.com/a/9384894/783743

BTW,你可以在JavaScript中模擬動態範圍界定太:Is it possible to achieve dynamic scoping in JavaScript without resorting to eval?

+0

您是否知道編譯後的語言(即C/C++)在運行時還是編譯時使這些綁定成爲可能? – contactmatt 2013-02-22 16:17:26

+0

C/C++中局部變量的空間通常保留在調用堆棧中。我不知道內部結構,但我的猜測是在編譯時確定父範圍的偏移量,但實際地址只能在實際調用函數時的運行時確定。 – 2013-02-22 16:22:44

0

我相信沒有編譯器的Javascript,我不希望引發討論。

回到你的問題,當Javascript被下載到瀏覽器時,函數的主體永遠不會執行。它需要被明確調用。因此,除非函數被調用,否則無法進行變量綁定。