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

标签 javascript jquery

我正在尝试理解代码

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/

相关文章:

javascript - JavaScript 代码出错?

jQuery prop() 方法返回错误的 id

jquery - 读取浏览器 Cookie ... jQuery

jquery - 如何在提交表单后再次运行 jQuery 验证器代码?

javascript - 使用 Modernizr 使用 window.location.origin

javascript - 插入前 Firebase 检查数据是否存在

javascript - 单击 "Upload"按钮时不出现警报

javascript - 查找属性是否在脚本标签内

javascript - 使用 history.js 使用多个 GET 参数

jquery - Font Awesome 图标不会移动