编写JavaScript代码时,咱们要时刻牢记,JavaScript引擎是一个事件驱动的执行引擎,代码老是以单线程执行,而回调函数的执行须要等到下一个知足条件的事件出现后,才会被执行。异步
例如,setTimeout()
函数能够传入回调函数,并在指定若干毫秒后执行:函数
function printTime() { console.log('It is time!'); } setTimeout(printTime, 1000); console.log('done');
上面的代码会先打印done
,1秒后才会打印It is time!
。spa
若是printTime()
函数内部发生了错误,咱们试图用try包裹setTimeout()
是无效的:线程
'use strict'; function printTime() { throw new Error(); } try { setTimeout(printTime, 1000); console.log('done'); } catch (e) { alert('error'); }
缘由就在于调用setTimeout()
函数时,传入的printTime
函数并未马上执行!紧接着,JavaScript引擎会继续执行console.log('done');
语句,而此时并无错误发生。直到1秒钟后,执行printTime
函数时才发生错误,但此时除了在printTime
函数内部捕获错误外,外层代码并没有法捕获。code
因此,涉及到异步代码,没法在调用时捕获,缘由就是在捕获的当时,回调函数并未执行。orm
相似的,当咱们处理一个事件时,在绑定事件的代码处,没法捕获事件处理函数的错误。blog
例如,针对如下的表单:事件
<form> <input id="x"> + <input id="y"> <button id="calc" type="button">计算</button> </form>
咱们用下面的代码给button绑定click事件:ip
'use strict'; var $btn = $('#calc'); // 取消已绑定的事件: $btn.off('click'); try { $btn.click(function () { var x = parseFloat($('#x').val()), y = parseFloat($('#y').val()), r; if (isNaN(x) || isNaN(y)) { throw new Error('输入有误'); } r = x + y; alert('计算结果:' + r); }); } catch (e) { alert('输入有误!'); }
可是,用户输入错误时,处理函数并未捕获到错误input