setTimeout里面的闭包

时间:2022-09-29 22:44:15

上一篇文章,我们了解了什么是闭包,接下来。来看看代码中常用的闭包

    function wait(msg) {
setTimeout(function timer(){
console.log(msg)
},1000)
}
wait("hello")

是的,你没有看错,上面的例子中使用到了闭包,相信很多的小伙伴此刻一定傻逼了,,,睁大了我的小眼睛,也没有看出来到底哪里使用了闭包。。

这段代码的执行结果就是,1秒之后,打印出了hello 
没关系,如果这个看不出来的话,我们不妨把代码变化一下

    function wait(msg) {
function timer(){
console.log(msg)
}
setTimeout(timer,1000)
}
wait("hello")

这样子理解起来容易多了是吧,这个代码和上面那个执行效果是一样的。。如果还是理解不了的话。我们再来举出一个例子

    function wait(msg) {
function timer(){
console.log(msg)
}
fn(timer)
}
function fn(fnc){
fnc();
}
wait("hello")

在这里,我们将setTimeout()换成了fn(),将函数timer()当作参数传递给了函数fn(),并却用变量fnc接受,当调用fnc的时候,我们相当于是在fn这个环境下面使用了函数wait()的变量。因此,用到了闭包

下面回归正题,其实内置的setTimeout()函数,拥有对一个参数的引用,也许这个参数就和我们上面一样,叫做fnc,或者是其他的名字,timer()函数被当作参数传给内置的setTimeout()函数,从而在setTimeout()的作用域中访问到wait()函数内部的变量msg,而这,就是使用闭包的结果。