var callback = function () {
console.log("时间到——————");
}
var time1 = setTimeout(callback, 3000);
var time2 = setInterval(callback, 5000);
为啥吧callback放在time1 time2 后面就不显示 时间到了呢
这个不是延时执行吗 按理说callback 在time1 time2 执行前已经得到函数指针了呀
放在后面也是有值得呀
首先,我理解的你的问题是,把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
但是如果我们将声明改为函数声明的话,程序就会正常去执行
继续回答问题,楼主说‘这个不是延时执行吗 按理说callback 在time1 time2 执行前已经得到函数指针了呀’
这里传入setT中的函数确实是延时执行的,但是setT本身是同步去执行的也就是立即去执行的,所以在setT执行时被绑定的异步函数已经是undefined,后面虽然callback是有值了,但是到时间以后从队列里勾出要执行的函数依旧是undefined。