据我所知,所有JavaScript代码都是事件驱动的,并在单个浏览器线程上执行.
但是,我有一些JavaScript函数可以从位于同一页面的SWF对象中调用.此代码是否以与常规JS代码相同的方式运行,还是在某个单独的Flash线程上运行?
如果它在一个单独的线程上,我可以使用setTimeout()来使它在JS事件线程上运行吗?例如:
function calledFromFlash() { setTimeout(doActualWork, 0); } function doActualWork() { // blah blah blah }
Rex M.. 10
它仍然在同一个线程上.但是,对于大多数实际用途,如果你有一个长期运行的JavaScript,你担心你的"主"任务可能会阻止来自setTimeout的调用,你应该考虑重新访问你的基础方法.
更新赏金:
为了扩展JavaScript中更一般的线程问题,Bobince的一个非常有启发性的答案进行了很好的讨论.他列举了一些非常有趣的场景,这些场景可能会让人怀疑我们是否真的可以认为JS是单线程的,而他的结论是"不完全".
我同意这些评论的结论是,从JS运行时内部来看,Universe是单线程的,但由于JS沙箱周围的基础架构不是单线程的,因此它可以到达沙箱和垃圾箱内部以意想不到的方式与国家.从运行时内部,一些未知的实体可以"暂停自然法则"并改变现状.但是运行时没有线程构造来本机处理该场景.
我认为解决这个问题最重要的方法是询问实际场景中多线程的含义是什么?通常线程问题归结为同步等问题,我们不得不假设浏览器供应商已经为我们解决了问题,因为JavaScript本身甚至没有尝试自己处理它也没有本机构造.如果没有工具来解决问题,那么对于线程的扯皮是没有用的; 没有互斥锁或锁.
因此,抛开那些灾难性的问题,我们可能会意外地从我们身下改变价值.但是编写良好的代码应该可以.即使在Bobince的例子中,所涉及的所有代码仍然是我们自愿包含在页面中的代码(甚至是自己编写的),所以可以肯定的是,如果在主要的callstack表面上被"阻塞"时代码被触发可能会令人惊讶.但是再次谈到实际问题,在这种情况下你能对自己做的最糟糕的事情是什么?没什么太严重的.
所以这是我漫长的说法:我不知道浏览器供应商的任何文档,他们明确地说他们的JS实现是否是单线程的,但我怀疑这是否重要.
它仍然在同一个线程上.但是,对于大多数实际用途,如果你有一个长期运行的JavaScript,你担心你的"主"任务可能会阻止来自setTimeout的调用,你应该考虑重新访问你的基础方法.
更新赏金:
为了扩展JavaScript中更一般的线程问题,Bobince的一个非常有启发性的答案进行了很好的讨论.他列举了一些非常有趣的场景,这些场景可能会让人怀疑我们是否真的可以认为JS是单线程的,而他的结论是"不完全".
我同意这些评论的结论是,从JS运行时内部来看,Universe是单线程的,但由于JS沙箱周围的基础架构不是单线程的,因此它可以到达沙箱和垃圾箱内部以意想不到的方式与国家.从运行时内部,一些未知的实体可以"暂停自然法则"并改变现状.但是运行时没有线程构造来本机处理该场景.
我认为解决这个问题最重要的方法是询问实际场景中多线程的含义是什么?通常线程问题归结为同步等问题,我们不得不假设浏览器供应商已经为我们解决了问题,因为JavaScript本身甚至没有尝试自己处理它也没有本机构造.如果没有工具来解决问题,那么对于线程的扯皮是没有用的; 没有互斥锁或锁.
因此,抛开那些灾难性的问题,我们可能会意外地从我们身下改变价值.但是编写良好的代码应该可以.即使在Bobince的例子中,所涉及的所有代码仍然是我们自愿包含在页面中的代码(甚至是自己编写的),所以可以肯定的是,如果在主要的callstack表面上被"阻塞"时代码被触发可能会令人惊讶.但是再次谈到实际问题,在这种情况下你能对自己做的最糟糕的事情是什么?没什么太严重的.
所以这是我漫长的说法:我不知道浏览器供应商的任何文档,他们明确地说他们的JS实现是否是单线程的,但我怀疑这是否重要.