2017-06-20 94 views
1

在傳統for循環的初始化表達式中使用let時,它的作用域爲for循環的塊。在for循環的初始化表達式中聲明的變量始終在詞法上始終在體內

細則中指出:

letconst聲明定義被限定在 運行變量執行上下文的LexicalEnvironment

是否意味着的i聲明的一點是(甚至在ES5是(?))詞法(語義我知道使用var將它懸掛)塊包括主體for循環(因爲它天真地看起來好像它是外面它)。

或者這是否意味着這是let和/或for循環的新特性,使其具有詞法上在循環體內的語義?

要清楚:我知道可見性語義是新的(即let的塊範圍與var的功能範圍)。我對定義的詞彙位置是否總是被置於循環體內感興趣。

for(let i = 0; i < 10; i++) { 
    // the body of the loop.... 
} 
+0

「*這是否意味着的'我申報點'在包含for循環體的塊內是詞法上的?*「 - 不,你是怎麼想的? – Bergi

+1

相關:[let'的語義和block for scoping for循環](https://stackoverflow.com/q/30899612/1048572) – Bergi

+0

不應該使用[tag:language-lawyer]標記該帖子嗎? – Dragomok

回答

2

其實,把它想象成一個假想的包裝塊,其中所有的for聲明的變量都是別名。有點像這樣:

// Original 
for (let i = 0; i < 10; i++) { ... } 

// Equivalent 
{ 
    let _i; 
    for (_i = 0; _i < 10; _i++) { 
     let i = _i; 
     ... 
     _i = i; 
    } 
} 

它通過創建for內一個新的範圍,別名變量,然後有效地在每個塊的最後更新的別名。

(當然,發動機實現它不同於此,但是當你進入編譯原理和觀測的語義和實際執行之間的差異很。)

+0

在ES2015中,初始化表達式中的'var'聲明是爲了在for循環體塊內部或外部擁有一個**詞法**聲明點? – Ben

+0

'var'被掛起到函數頂部,就像它一直有的一樣。在這方面沒有任何改變。 –

+0

綁定每迭代功能不適用於具有傳統for循環的'const'。然而,'let','const' *的提升行爲與你的答案相同。每次迭代綁定行爲是我理解中缺少的一部分。 – Ben