看看you don`t know js里面有个闭包问题没理解
发布于 7 年前 作者 suntopo 3964 次浏览 来自 问答

代码

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

由于setTimeout实在全局执行,而timer作为参数传递出其声明的作用域,引用了msg并在外作用域执行,所有构成了闭包,这里是明白的。但是书中有这样一句话,没懂。

wait(…)在执行1000毫秒后,他的并不作用域并不会消失,timer函数依然保有wait()作用域的闭包

为什么1000毫秒后,timer已经执行完毕了,还说保有该闭包呢,此时不应销毁了吗?

晓得它是什么意思了: 它说的1000ms意思是主要只是timer刚开始执行,我意会成了1000ms后包括了1000ms~∞ms了

8 回复

可能是翻译错误吧,这里应该是在wait函数执行1000毫秒之后里面的timer函数的作用域没有消失

@steambap 如果安你的说法,timer函数作用域为啥没消失呢,函数已经执行完了。

@suntopo 这里只是说wait执行完了,还有timer执行时的作用域里面能查到wait函数的参数,并无任何timer函数作用域应该消失的说法

@steambap wait执行完的确是,但是1000毫秒之后,timer也执行完毕了,此时不会再持有wait的作用域了,所以应该都会销毁啊

1000毫秒后 timer 才开始执行而不是执行完毕,所以作用域不会被销毁的。 这里就是想告诉你此时 timer 还能取到外层作用域的变量 msg,这在 javascript 里是很自然的,而某些语言里你需要特别声明才能做到。

@chemzqm 哦哦,它说的1000ms意思是主要只是timer刚开始执行,我意会成了1000ms后包括了1000ms~∞ms了

@steambap 它说的1000ms意思是主要只是timer刚开始执行,我意会成了1000ms后包括了1000ms~∞ms了

timer执行的时候是 1000ms 以后 也可能是2000ms 排队读的多,超时都有可能的。

回到顶部