gpt4 book ai didi

javascript - 从匿名包装器返回一个函数?

转载 作者:搜寻专家 更新时间:2023-11-01 05:25:10 24 4
gpt4 key购买 nike

我正在尝试理解代码

for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}

从这里http://bonsaiden.github.com/JavaScript-Garden/#function.closures

我理解这个方法:

for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}

谁能帮我解释一下第一个?

我将尝试解释我是如何理解第一个的,

first i is 0,
setTimeout is called,
self calling function "function(e)" is called with i=0,
Im stuck!! what happens when this function returns a function?

最佳答案

第一个所做的就是返回一个函数,该函数将在超时发生后调用。

它的目的是为 for 循环的每次迭代创建一个子范围,以便递增的 i 不会被每次迭代覆盖。

更多解释:

让我们把它分成两个不同的部分:

for(var i = 0; i < 10; i++) {
setTimeout((function(e) {
return function() {
console.log(e);
}
})(i), 1000)
}

这是第一部分:

for(var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i); //9-9
},1000);
}

现在,当您运行此循环时,您将始终获得包含 9 而不是 0 到 9 的 console.log()。这是因为每个 setTimeout 都使用对 i 的相同引用.

如果您将其中的 setTimeout 部分包装在一个匿名函数中,它会为每次迭代创建一个范围,允许每个 setTimeout 拥有它自己的 i 值。

for(var i = 0; i < 10; i++) {
setTimeout((function(i) {
return function() {
console.log(i); // 0-9
}
})(i), 1000)
}

setTimeout 中的外部函数会立即执行,第一次迭代时 i 为 0,第二次迭代时为 1,依此类推。然后该函数依次返回一个函数,该函数是 setTimeout 使用的函数。使用不同的 i 值为循环的每次迭代生成并返回一个函数。

关于javascript - 从匿名包装器返回一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11200279/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com