gpt4 book ai didi

javascript - 'window' 在 JavaScript 中真的是全局的吗?

转载 作者:行者123 更新时间:2023-12-03 00:42:56 25 4
gpt4 key购买 nike

在浏览器中获取这段 JavaScript 代码:

<script>
console.log(window.someThing);
var x = 12;

function foo() {
window.otherThing = x;
}
</script>

foo内我们可以访问window。我们都知道这一点,但到底为什么呢?

  • 它是某种特殊的全局变量吗?
  • 或者“根作用域”(在 script 标记内)是否将其作为隐式局部变量,并且它是否像任何其他局部变量(如 x 上面)可以吗?

这与直接在 script 标记内声明的变量被设置为 window 的属性如何一致? (或者事实并非如此?)

<script>
var x = 12;
function() {
console.log(window.x);
}
</script>

最佳答案

您可以在 ECMAScript 中访问“超出范围”“自由”变量的原因是所谓的作用域链。作用域链是每个执行上下文的特殊属性。正如之前多次提到的,上下文对象至少看起来像:

  • [[范围]]
  • 变量/激活对象
  • “这个”上下文值

每次您在上下文(例如函数)中访问变量(名称)时,查找过程始终在其自己的激活对象中启动。所有形式参数、函数声明和本地定义的变量 (var) 都存储在该特殊对象中。如果在该对象中找不到变量名,则搜索将进入[[Scope]]链。

每次初始化函数(-context)时,它都会将所有父上下文变量/激活对象复制到其内部[[Scope]]属性中。这就是我们所说的词法范围。这就是为什么 closures 在 ECMAScript 中工作。由于全局上下文也有一个变量对象(更准确地说,**全局对象的变量对象是全局对象本身),它也会被复制到函数< em>[[范围]] 属性。

这就是为什么您可以从任何函数中访问窗口的原因:-)

上述解释有一个重要的概念性结论:ECMAScript 中的任何函数都是闭包,这是事实。因为每个函数至少会复制其[[Scope]]属性中的全局上下文VO

关于javascript - 'window' 在 JavaScript 中真的是全局的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6679635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com