关于《你不知道的JavaScript(中卷)》中“回调”章节中的案例的一个疑惑(setTimeout()相关)

题目描述

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”

实际运行结果:

图片描述

阅读 1.8k
3 个回答

先执行了asyncify(result),定时器那一步分解一下,你应该就能看懂了。

var a = 0;
var timeoutFn = asyncify(result);
var b = setTimeout(timeoutFn,100);

a++;
console.log('end');

因为asyncify(result)先执行了。

你这样想
setTimeout(fn, 100)
fn是定义的一个函数,它是隔了100毫秒才执行
但是如果你写成 setTimeout(fn(), 100) 这是函数自调用,fn函数会立即执行,
隔了100毫秒,才会执行fn return后的函数

推荐问题