js 延时执行

var callback = function () {
                console.log("时间到——————");
            }
            var time1 = setTimeout(callback, 3000);
            var time2 = setInterval(callback, 5000);

为啥吧callback放在time1 time2 后面就不显示 时间到了呢
这个不是延时执行吗 按理说callback 在time1 time2 执行前已经得到函数指针了呀

放在后面也是有值得呀

阅读 2.8k
3 个回答

首先,我理解的你的问题是,把var callback = funciton .... 放到setT后面运行程序的话callback并没有被执行。
回答这个问题之前,我先说下提升。分变量提升和函数提升,就是说程序有一个编译阶段和执行阶段,先编译后执行,js程序也是,而且声明是在编译阶段完成的,执行是在执行阶段进行。比如这条语句: var a = 2; 在我们看来这就是a的一条声明语句,但是在js编译器看来这是两个部分,首先var a是变量的声明,在编译阶段进行,然后是a = 2编译器把它交给ji引擎去执行也就是在执行阶段进行的。 然后还要简单说一下变量提升和函数提升的区别,函数声明提升,会在编译阶段连同函数体一同提升,变量提升只是会提升变量的声明。

此时我们在回头来看这个问题,如果将这个var callback = function ... 放到后面的话,程序在执行前的编译阶段将var callback进行提升,也就是变量声明提升,此时作用域中有了callback这个变量,但是它是没有值的,也就是是undefined。所以此时传进setT中callback其实是undefined,所以‘时间到’肯定是不会执行到了,应该还会报typeError

但是如果我们将声明改为函数声明的话,程序就会正常去执行

var time1 = setTimeout(callback, 3000);
var time2 = setInterval(callback, 5000);
function callback() {
    console.log("时间到——————");
}

继续回答问题,楼主说‘这个不是延时执行吗 按理说callback 在time1 time2 执行前已经得到函数指针了呀
这里传入setT中的函数确实是延时执行的,但是setT本身是同步去执行的也就是立即去执行的,所以在setT执行时被绑定的异步函数已经是undefined,后面虽然callback是有值了,但是到时间以后从队列里勾出要执行的函数依旧是undefined。

有显示时间到呀

var callback = function(){//...} 是一个函数表达式。
JavaScript中的函数表达式没有提升,不像函数声明,你在定义函数表达式之前不能使用函数表达式:

callback(); //=> TypeError: callback is not a function
var callback = function(){
  console.log(1);
}

具体可以看MDN这篇文章了解什么是函数表达式和函数声明

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题