我已閱讀,並通過我自己的經驗發現,JavaScript沒有塊範圍。假設這種語言的設計出於某種原因,那是什麼原因?爲什麼block範圍最初不是在JavaScript中實現的?
我環顧四周,在谷歌和這裏,但我已經找到了帖子剛重申,JS具有的功能範圍,而不是阻止範圍,沒有說明原因。我很想知道爲什麼事實如此。
我已閱讀,並通過我自己的經驗發現,JavaScript沒有塊範圍。假設這種語言的設計出於某種原因,那是什麼原因?爲什麼block範圍最初不是在JavaScript中實現的?
我環顧四周,在谷歌和這裏,但我已經找到了帖子剛重申,JS具有的功能範圍,而不是阻止範圍,沒有說明原因。我很想知道爲什麼事實如此。
轉換我的評論回答的創造者的
選擇:我啾啾布倫丹並得到了following answer:
@mplungjan 10 days did not leave time for block scope. Also many "scripting languages" of that mid-90s era had few scopes & grew more later.
也就是說,這裏有一些相關的要點:
Important: JavaScript does not have block scope. Variables introduced within a block are scoped to the containing function or script, and the effects of setting them persist beyond the block itself. In other words, block statements do not introduce a scope. Although "standalone" blocks are valid syntax, you do not want to use standalone blocks in JavaScript, because they don't do what you think they do, if you think they do anything like such blocks in C or Java.
we can artificially introduce scopes by creating new functions and immediately invoking them
let
聲明的變量是不葫蘆編輯到封閉塊的開始處。因此,在分配其值之前引用let
聲明的變量將引發ReferenceError。
在同一個塊範圍相同的變量的重新說明提出一個SyntaxError。
+1直接從Brendan Eich得到答案:-) – Sc0ttyD
原因是多方面的,但有些我想到是在使用對象文本(這有時看起來像塊)分析/調試代碼,以幫助,並簡化局部變量的垃圾收集。
我希望承諾的支持(在這裏討論,例如,http://esdiscuss.org/notes/2012-07-25)證明是真實的,因爲使用變量如i
是非常方便的,這些變量對於只有一個循環是局部的。
塊範圍並沒有,原因如下實施:
if
語句中聲明並定義該變量。在像C這樣的語言中,您必須聲明if
語句之外的變量,並在if
語句中定義它。「塊範圍引入性能碰到像JavaScript這樣的動態語言。「 - 這是實現的屬性,而不是語言。也許它支持第一個JavaScript實現,但是在過去的十年中沒有任何引擎會遭受這種攻擊。 – Marijn
@Marijn也許吧。 –
#5)嚴格地說,我們不需要比我們首先需要使用JavaScript更多的塊範圍......謝天謝地,ECMA團隊似乎不同意通過通過'let'關鍵字添加對塊範圍的支持。簡單的語言結構總是受歡迎的。 –
JavaScript中的函數式編程風格並不鼓勵它我認爲再加上JS是一個衝動的概念,但'let'即將在ES6中出現,因此我們將在不久的將來擁有塊範圍。 Firefox已經支持'let'。 – elclanrs
創作者的選擇? [Block statement](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Statements?redirectlocale=zh-CN&redirectslug=JavaScript%2FGuide%2FStatements#Block_Statement),[解決方法](http ://zef.me/2843/javascript-the-scope-pitfall),[未來](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let#Block_scoping ) – mplungjan
@mplungjan我很樂意聽到有人從創作者處獲得信息。我希望這不僅僅是設計中的疏忽,而且還有一些原因是由於JavaScript的設計和/或限制造成的。這些鏈接很方便,非常感謝。 – mricci