簡體   English   中英

JavaScript代碼塊之間保持什么狀態?

[英]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-nodenode之間的哪個行為正確或符合標准?

僅供參考,版本為:

$ node --version
v7.10.0
~$ babel-node --version
6.24.1

“ JavaScript,優秀的部分”在constlet之前就被編寫和發布(2008年),這是JavaScript中的一件事(它們到達了ES6)。 這兩種方法都可以使您創建塊作用域變量。 同樣, var仍然可以完全相同地工作(它不是塊作用域的,其定義被提升到最近的(函數)作用域的頂部)。

constlet確實意味着是塊作用域的(請參閱MDN )-但是,在您的第一個示例中,Babel將代碼編譯為一種形式,該形式可以從存在該語法的黑暗時期開始在瀏覽器中運行1

"use strict";

{
  var a = 1;
};{
  var _a = 2;
};

正如evolutionxbox在注釋中指出的那樣, var 不是塊作用域的,因此這會導致一些稍微不標准的行為。 請注意,第二個a被重命名以避免名稱沖突-這就是為什么a在塊外求值為1而不是2

Babel理論上可以將這些塊包裝在IIFE中,或者可以適當地模擬塊作用域,但是我認為他們認為,對於這么小的事情,不值得讓代碼膨脹這么高的水平。

另一方面,Node實現constlet本地執行,而不是將其轉換為var語句,因此您可以在那里獲得符合標准的行為。


1.您可以使用Babel的在線REPL輕松查看Babel生成的代碼-如果不確定我的編譯后代碼為什么以某種方式運行,這通常是我的第一站電話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM