窗口真的在全球化吗?

在浏览器中使用这个Javascript:

<script>

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

function foo() {
   window.otherThing = x;
}

</script>

里面的foo我们可以访问窗口,大家都知道,但为什么呢?

>这是一种特殊的全局变量吗?
>或者“根范围”(脚本标签内部)是否将其作为隐式局部变量,并且像其他任何局部变量(如上面的x)可以简单地“闭包继承”?

而且,如何将脚本标签内直接声明的变量设置为窗口的属性呢? (还是不是吗?)

<script>
var x = 12;
function() {
   console.log(window.x);
}
</script>
您可以在ECMAscript中访问“超出范围”或“自由”变量的原因是所谓的“范围”链。范围链是每个执行上下文的特殊属性。如前所述,上下文对象至少看起来像:

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

每次在上下文(例如函数)中访问变量(-name)时,查找过程始终以其自己的激活对象开始。所有形式的参数,函数声明和本地定义的变量(var)都存储在该特殊对象中。如果在该对象中找不到变量,则搜索进入[[Scope]] – 链。每次函数(-context)被初始化时,它将把所有父上下文变量/激活对象复制到其内部[[Scope]]属性中。这就是我们所说的,一个词汇范围。这就是为什么Closures在ECMAscript中工作的原因。由于全局上下文也有一个变量对象(更准确地说,**全局对象的变量对象是全局对象本身),它也被复制到函数[[Scope]]属性中。

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

上面的解释有一个重要的概念结论:ECMAscript中的任何功能都是Closure,这是真的。由于每个函数至少将其[[Scope]]属性复制全局上下文VO。

http://stackoverflow.com/questions/6679635/is-window-really-global-in-javascript

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:窗口真的在全球化吗?