[英]What state is kept between JavaScript code blocks?
我從“ JavaScript,優秀的部分”中了解到JavaScript沒有塊作用域,甚至建議在函數的最開始處聲明變量,而不是在{ }
內部聲明變量,以免造成混淆。
但是,我對我剛剛使用babel-node --presets es2015
進行測試的示例感到困惑(在此處簡化):
> {const a = 1;}; {const a = 2;};
undefined
> a;
1
在這里,如果沒有如我在上一個問題中所討論的那樣,如果一行中的兩個const
變量賦值未包含在塊{}
,則它們將產生錯誤。 (因此,單獨的移植不應該成為問題)。
但是,在代碼塊中使用時,不會產生錯誤。 並且如上所示,第二個分配似乎根本沒有效果。
node
的行為也很有趣,
> {const a = 1;}; {const a = 2;};
undefined
> a;
ReferenceError: a is not defined
...
這是因為如果兩個代碼塊沒有發生, a
沒有定義。 所以:
為什么在代碼塊中包含語句會導致上述不同行為(即錯誤消失)?
在代碼塊之間要記住/忘記什么?
babel-node
和node
之間的哪個行為正確或符合標准?
僅供參考,版本為:
$ node --version
v7.10.0
~$ babel-node --version
6.24.1
“ JavaScript,優秀的部分”在const
和let
之前就被編寫和發布(2008年),這是JavaScript中的一件事(它們到達了ES6)。 這兩種方法都可以使您創建塊作用域變量。 同樣, var
仍然可以完全相同地工作(它不是塊作用域的,其定義被提升到最近的(函數)作用域的頂部)。
const
和let
確實意味着是塊作用域的(請參閱MDN )-但是,在您的第一個示例中,Babel將代碼編譯為一種形式,該形式可以從存在該語法的黑暗時期開始在瀏覽器中運行1 :
"use strict";
{
var a = 1;
};{
var _a = 2;
};
正如evolutionxbox在注釋中指出的那樣, var
不是塊作用域的,因此這會導致一些稍微不標准的行為。 請注意,第二個a
被重命名以避免名稱沖突-這就是為什么a
在塊外求值為1
而不是2
。
Babel理論上可以將這些塊包裝在IIFE中,或者可以適當地模擬塊作用域,但是我認為他們認為,對於這么小的事情,不值得讓代碼膨脹這么高的水平。
另一方面,Node實現const
並let
本地執行,而不是將其轉換為var
語句,因此您可以在那里獲得符合標准的行為。
1.您可以使用Babel的在線REPL輕松查看Babel生成的代碼-如果不確定我的編譯后代碼為什么以某種方式運行,這通常是我的第一站電話。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.