如何理解 JS 领域
How to understand JS realms
在 ECMAScript 规范中引入了 "realms" 的概念:
Before it is evaluated, all ECMAScript code must be associated with a realm. Conceptually, a realm consists
of a set of intrinsic objects, an ECMAScript global environment, all of the ECMAScript code that is loaded
within the scope of that global environment, and other associated state and resources.
在 Rauschmayer 的书中 "Speaking JavaScript" 作者写到可以跨越领域的对象:
In web browsers, each frame and window has its own realm with separate global variables. That prevents instanceof from working for objects that cross realms.
"realm" 究竟是什么?除了frame还有什么可以将网站代码分隔到另一个境界,有什么后果?
语言参考使用抽象术语,因为 JavaScript 环境差异很大。在浏览器中,window(一个框架,用 window.open()
打开的 window,或者只是一个普通的浏览器选项卡)是一个领域。 web worker 是不同于 window 的领域,但它是一个领域。服务人员也是如此。
object 可以跨越领域边界,因为从公共基础 window 打开的 windows 可以通过函数调用和简单的变量引用进行相互通信。在您引用的摘录中提到 instanceof
与此有关。在 <iframe>
window:
中考虑这段代码
window.parent.someFunction(["hello", "world"]);
然后想象一下 parent window 中的一个函数:
function someFunction(arg) {
if (arg instanceof Array) {
// ... operate on the array
}
}
那行不通。为什么?因为在 <iframe>
window 中构造的数组是从那个领域中的 Array 构造函数构造的,因此数组是 而不是 从 Array 中的 Array 构造的实例parent window.
web worker 领域和 window 领域之间存在更强大的 "wall",并且在这些交互中不会发生这种影响。
在 ECMAScript 规范中引入了 "realms" 的概念:
Before it is evaluated, all ECMAScript code must be associated with a realm. Conceptually, a realm consists of a set of intrinsic objects, an ECMAScript global environment, all of the ECMAScript code that is loaded within the scope of that global environment, and other associated state and resources.
在 Rauschmayer 的书中 "Speaking JavaScript" 作者写到可以跨越领域的对象:
In web browsers, each frame and window has its own realm with separate global variables. That prevents instanceof from working for objects that cross realms.
"realm" 究竟是什么?除了frame还有什么可以将网站代码分隔到另一个境界,有什么后果?
语言参考使用抽象术语,因为 JavaScript 环境差异很大。在浏览器中,window(一个框架,用 window.open()
打开的 window,或者只是一个普通的浏览器选项卡)是一个领域。 web worker 是不同于 window 的领域,但它是一个领域。服务人员也是如此。
object 可以跨越领域边界,因为从公共基础 window 打开的 windows 可以通过函数调用和简单的变量引用进行相互通信。在您引用的摘录中提到 instanceof
与此有关。在 <iframe>
window:
window.parent.someFunction(["hello", "world"]);
然后想象一下 parent window 中的一个函数:
function someFunction(arg) {
if (arg instanceof Array) {
// ... operate on the array
}
}
那行不通。为什么?因为在 <iframe>
window 中构造的数组是从那个领域中的 Array 构造函数构造的,因此数组是 而不是 从 Array 中的 Array 构造的实例parent window.
web worker 领域和 window 领域之间存在更强大的 "wall",并且在这些交互中不会发生这种影响。