繁体   English   中英

为什么在 JavaScript 中的 window object 中添加了全局变量?

[英]Why are global variables added to a window object in JavaScript?

为什么在 JavaScript 中的 window object 中添加了全局变量?

var a = 1;
console.log(window.a);

ECMAScript 2015 语言规范没有说声明的 var 或 function 被添加到 window 全局对象中。 但是,我想知道为什么将声明为 var 的全局变量作为属性添加到 window object 中。

我很好奇的是它与 ECMAScript 语言规范无关?

我使用了翻译器,所以如果它很奇怪,请理解。

实际上,在此处的规范中已指出,当不存在此类标识符时将变量分配给:

If IsUnresolvableReference(V) is true, then
  a. If V.[[Strict]] is true, throw a ReferenceError 
exception.
  b. Let globalObj be GetGlobalObject().
  c. Return ? Set(globalObj, V.[[ReferencedName]], W, false).

在这里,在 CreateGlobalVarBinding 中,当在脚本的顶层声明变量时调用它。

6. Let varDeclarations be the VarScopedDeclarations of script.
...
18. For each String vn of declaredVarNames, do
  a. Perform ? env.CreateGlobalVarBinding(vn, false).

全局 object 可能是浏览器中的window ,或者是 web worker 中的self ,或者Node global等。

我认为var导致属性被添加到全局 object (在您提供的示例中)的原因与 Javascript 中环境的linked方式有关; 它们由外部引用链接,但全局环境没有外部引用。 也许将它们绑定到全局 object 作为属性的选择源于全局环境中缺乏外部引用。

全局 scope 是“最外层”的 scope - 它没有外层 scope。 它的环境是全球环境。 每个环境都通过由外部引用链接的环境链与全局环境连接。 全局环境的外部参考是null

来源: https://2ality.com/2019/07/global-scope.html#the-global-object

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM