如果您不知道我在说什么,请阅读John Resig - JavaScript定时器如何工作以及JavaScript是否保证是单线程的?
有几个触发器将JS引擎执行FiFo中的任务排入队列.这不是任何标准的一部分,所以我试图找到这些触发器的详尽列表.(我想这一切都归结为内部事件处理程序,如脚本加载事件或计时器事件,但我宁愿忽略引擎的内部结构,从用户的角度来看待事物.)
到目前为止我已经确定了
<script>初始文件中的要素(包括添加的要素document.write)*<script> JS在运行时插入的元素*window.setTimeoutwindow.setInterval*)仅在Browser/DOM环境中
还有吗?JS引擎之间有什么区别吗?
“JavaScript”作为语言名称实际上不应该被使用,因为它太宽泛了。
ECMAScript 就是你所指的。您可以在http://www.ecmascript.org/上找到有关 ECMAScript 的信息 。该语言标准称为 ECMA-262,大多数浏览器都支持 5.1 版。
setTimeout、setInterval、DOM 事件等不是该语言的一部分。这些由主机环境作为主机对象提供。为广泛的主机环境编写 ECMAScript 在使用主机对象时应特别小心。
ECMAScript 代码在执行上下文中执行。它采用堆栈的形式,并将当前执行上下文的状态保存在顶部。
有 3 种方法可以推送执行上下文。全局代码、eval 和函数。这是启动代码的唯一方法。主机环境将使用这些方法来执行代码。
主机环境可以提供调用堆栈。这用于堆栈由可以在独立线程中运行的主机对象生成的函数调用。通常,诸如 setTimeout 之类的事件会将函数添加到调用堆栈中。然后,主机环境将等待执行上下文堆栈为空,然后从调用堆栈中弹出函数,创建新的执行上下文,执行代码直至完成。它将重复此操作,直到调用堆栈为空。
尝试构建宿主对象执行上下文管理器的完整列表是徒劳的。
回答问题。
还有吗?是的,还有更多。这超出了本答案的范围。请参阅您要使用的特定主机环境。
JS 引擎之间有什么区别吗?(ECMAScript 主机环境)。是的。同样,这超出了本答案的范围,并且取决于主机
有数十个主机环境,并且一直在创建新的环境。触发新执行上下文创建的因素高度依赖于主机环境。