【问题标题】:How to understand JS realms如何理解 JS 领域
【发布时间】:2018-09-24 17:02:42
【问题描述】:

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

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

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

在网络浏览器中,每个框架和窗口都有自己的领域,并带有单独的全局变量。这可以防止 instanceof 为跨领域的对象工作。

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

【问题讨论】:

  • 您是否遇到了一些特殊问题,或者您只是想理解这个概念?
  • 我试图理解这个概念。我在不同的关于 JS 的书籍中找到了对领域的引用,但从未对这个主题进行过任何详细的描述。
  • 除了窗口间函数调用,这取决于你的前端架构可能是也可能不是你必须担心的事情,“领域”的概念真的不是作为一个基本概念。领域是像ObjectArray 这样的全球标准构造函数“生存”的地方。
  • @Pointy 我认为更重要的是声明每个领域都有自己的“全局”范围:-)

标签: javascript ecmascript-6 ecmascript-5


【解决方案1】:

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

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

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

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

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

行不通。为什么?因为在<iframe> 窗口中构造的数组是从该领域中的 Array 构造函数构造的,因此该数组不是从父窗口中的 Array 构造的实例。

在 Web Worker 领域和窗口领域之间有一道更坚固的“墙”,在这些交互中不会发生这种影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2013-03-29
    • 2020-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多