setTimeout(fn,delay)在一定延迟后执行函数,fn会被放入到事件队列中,等待当前的程序执行完毕,才会从事件队列中选择下一个事件执行。
当fn执行时,fn已经不在调用setTimeout的环境了,此时已经在window全局环境下
例1:
function fun(){
setTimeout(()=>{
console.log(this)
},1000);
}
fun();
结果:window
例2:
function fun(){
var aa=88;
setTimeout(()=>{
console.log(aa)
},1000);
}
fun();
如果这样写代码呢,上面讲的此时回调函数执行环境是window,但是全局环境却没有定义aa,所以是不是会输出undefined
呢?
结果:
88
为什么会输出88呢,因为在调用setTimeout时发生了闭包,定义匿名函数的时候调用当时
fun
函数作用域中定义的aa,再回调的时候形成了闭包。
闭包是什么?书上的定义很长,而且差不多都是一个函数返回一个调用内部变量的函数,这个样子定义。之前看到一篇文章说:一个作用域引用了另一个作用域中的变量就形成了闭包,我觉得这个定义更容易理解。