题目描述
setTimeout()
内的程序提前运行。按照正常的情况,不是应该在当前 stack 内全部执行完成后才执行,setTimeout()
函数的吗?
题目来源及自己的思路
《你不知道的JavaScript(中卷)》的书中的案例改写而来,其实我本身这个案例了解不够透彻
相关代码
function asyncify(fn) {
var orig_fn = fn,
intv = setTimeout(function () {
console.log('异步1')
intv = null;
if (fn) fn();
}, 0);
console.log('Wai intv:'+intv);
fn = null;
return function () {
console.log('异步2')
console.log('Nei intv:'+intv);
if (intv) {
fn = orig_fn.bind.apply(
orig_fn,
[this].concat([].slice.call(arguments))
);
} else {
console.log('异步3')
orig_fn.apply(this, arguments);
}
};
}
function result(data) {
console.log(a);
}
var a = 0;
var b = setTimeout(asyncify(result),100);
a++;
console.log('end');
你期待的结果是什么?实际看到的错误信息又是什么?
接待的结果是:按照 setTimeout()
内函数执行时间,应该是排在当前 stack 内的函数执行完成后。
所以,我认为,应该先输出“end”
, 后输出“Wai intv:1”
实际运行结果:
先执行了
asyncify(result)
,定时器那一步分解一下,你应该就能看懂了。