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