在ECMAScript规范中,引入了“领域”的概念:
在评估之前,所有ECMAScript代码都必须与领域相关联。从概念上讲,一个领域包括 一组内部对象,一个ECMAScript全局环境,所有加载的ECMAScript代码 在该全球环境范围内,以及其他相关的州和资源。
在Rauschmayer的书“Speaking JavaScript”中,作者写了关于可以跨领域的对象:
在Web浏览器中,每个框架和窗口都有自己的领域,具有单独的全局变量。这可以防止instanceof为跨越领域的对象工作。
究竟是什么构成了“境界”?除了框架之外还有什么可以将网站代码分隔到另一个领域以及后果是什么?
答案 0 :(得分:10)
语言参考使用抽象术语,因为JavaScript环境可能差异很大。在浏览器中,窗口(框架,用window.open()
打开的窗口,或只是普通的浏览器选项卡)是一个领域。网络工作者是一种与窗口不同的领域,但它是一个领域。服务工作者也一样。
对象跨越领域边界是可能的,因为从公共基本窗口打开的窗口可以通过函数调用和简单变量引用进行相互通信。在你引用的摘录中提及instanceof
与此有关。在<iframe>
窗口中考虑此代码:
window.parent.someFunction(["hello", "world"]);
然后想象父窗口中的一个函数:
function someFunction(arg) {
if (arg instanceof Array) {
// ... operate on the array
}
}
为什么?因为在<iframe>
窗口中构造的数组是从该领域中的Array构造函数构造的,因此该数组不是从父窗口中的Array构造的实例。
有一个更强大的墙壁&#34;在Web工作者领域和窗口领域之间,这些影响不会在这些交互中发生。