【问题标题】:How do Javascript's "multiple execution contexts" work?Javascript 的“多执行上下文”是如何工作的?
【发布时间】:2009-10-15 15:27:38
【问题描述】:

Javascript 没有可见线程(不过——工作线程即将到来,请参阅JavaScript and Threads 中的更多信息)。

但是,它似乎确实有多个似乎同时存在的执行上下文——当您有多个 Firefox Windows 和多个 Firefox/IE 选项卡时,它们是独立的。

当您在页面上有多个 iframe 时,每个 iframe 都有自己的执行上下文,但它们具有共享数据。如果两个 iframe 在同一个域中,它们可以访问彼此的 DOM 并调用彼此的函数。尽管如此,我在谷歌上找不到调度模型的描述,即它是否是:

  • 并行/抢先,在这种情况下——你可以暂时挂起吗?任何形式的互斥?
  • 合作,在这种情况下——如何让步于另一个环境?
  • 不重叠 - 即,主框架中的事件处理程序必须在 iframe 中的事件处理程序被调用之前返回(反之亦然)?

所以问题是:

  • 是否有保证的上下文切换模型?
  • 如果不是,流行的上下文切换模型是什么?
    • 似乎 Firefox 和 IE 在同一选项卡上下文之间以及在同一进程中的不同选项卡/窗口之间有一个不重叠的时间表 - 但我不确定。
    • Chrome 对不同的标签页使用系统调度程序(可能使用多个内核,属于并行/抢占组,但我不知道它对同一标签页中的多个帧使用什么。
    • 我不知道 Safari 或 Opera。

谢谢!

【问题讨论】:

    标签: javascript internet-explorer firefox safari google-chrome


    【解决方案1】:

    在 Firefox 中,网页中的所有 JavaScript 都运行在主线程上,所以都是序列化的。每个帧都会有自己的JSContext,每个方法都会执行到完成。没有抢占。

    【讨论】:

    • (你知道,但为了完整起见:那是 Firefox 3.5。随着浏览器变得多进程,就像 Chrome 已经是,Firefox 将在以后有几个版本,不相关的选项卡可能会独立运行,而(至少对于现在)对于“相关”标签,浏览器开发人员尝试保留“运行到完成”语义。)
    • 当然,但是 Firefox 还没有这样做,至少在 Firefox 4.0 之前不会这样做;)
    • 单独的选项卡位于单独的进程中,那里没有问题。一个选项卡中的 iframes/frames 仍然共享同一个线程。 Js 开发者依然可以轻松呼吸,不用担心并发。
    猜你喜欢
    • 2014-04-05
    • 2015-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 2010-12-09
    相关资源
    最近更新 更多