Eug*_*ash 5 javascript exception function setinterval
Javascript的setInterval()似乎不关注它调用的代码是否抛出异常.例如,这不会终止程序,而是一遍又一遍地调用函数:
setInterval(function() { throw "error" }, 1000);
Run Code Online (Sandbox Code Playgroud)
这种行为的原因是什么?是否记录在任何地方?
MDN文档针对throw抛出的对象说:
如果调用方函数之间不存在catch块,则程序将终止。
这不是严格准确的。ECMAScript规范第10.4节
引发的异常也可能会退出一个或多个执行上下文。
这更准确。
什么是执行上下文?好吧,您的原始程序有一个。进行函数调用时,该函数运行时会创建一个嵌套上下文。拨打电话eval将拨打电话。10.4涵盖了这一点。
通常,当引发异常时,它将在所有嵌套的执行上下文中向上传递,直到被捕获,或者到达外部执行上下文为止。如果未在执行上下文中捕获该上下文,则该上下文将终止。因此,如果您的原始程序是最外部的执行上下文,它将终止于未捕获的异常吗?
当您的处理函数被调用时,由于您的setTimeout时间间隔到期,它是最外部的执行上下文。因此,未捕获的异常将终止它,但是它不会嵌套在您的原始程序中。因此,其他任何事情都不会终止。
处理计时器的线程到期是JS引擎的一部分,因此您也不会终止该线程。因此,每个间隔一次,在调用处理程序函数时会创建一个新的执行上下文,并重复执行。
| 归档时间: |
|
| 查看次数: |
1377 次 |
| 最近记录: |