如何理解JS领域

问题描述 投票:13回答:1

在ECMAScript规范中,引入了“领域”的概念:

在进行评估之前,所有ECMAScript代码都必须与一个领域相关联。从概念上讲,领域包括一组内部对象,一个ECMAScript全局环境,所有已加载的ECMAScript代码在该全球环境以及其他相关状态和资源的范围内。

在Rauschmayer的书“ Speaking JavaScript”中,作者写到了可以跨越领域的对象:

在网络浏览器中,每个框架和窗口都有其自己的领域,并具有单独的全局变量。这会阻止instanceof对跨领域的对象起作用。

究竟是什么构成“领域”?除了框架之外,还有什么可以将网站代码分隔到另一个领域,其后果是什么?

javascript ecmascript-6 ecmascript-5
1个回答
11
投票

语言参考使用抽象术语,因为JavaScript环境可能差异很大。在浏览器中,一个窗口(框架,用window.open()打开的窗口或只是一个普通的浏览器选项卡)就是一个领域。网络工作者是与窗口不同的领域,但这是一个领域。服务人员也是如此。

对象有可能跨越领域边界,因为从公共基础窗口打开的窗口可以通过函数调用和简单变量引用进行互通。您引用的摘录中提到instanceof与此有关。在<iframe>窗口中考虑以下代码:

window.parent.someFunction(["hello", "world"]);

然后在父窗口中想象一个函数:

function someFunction(arg) {
  if (arg instanceof Array) {
    // ... operate on the array
  }
}

将不起作用。为什么?因为<iframe>窗口中构造的数组是从该领域中的Array构造函数构造的,所以该数组<< not >>是从父窗口中的Array构造的实例。Web worker领域和窗口领域之间有一个更强大的“墙”,并且在这些交互中不会发生这种影响。

© www.soinside.com 2019 - 2024. All rights reserved.