javascript - Javascript 中的闭包 : assigning local variable doesn't work

标签 javascript closures

就在我以为我理解闭包的时候......

以下代码片段:

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = function () {
            var x = i;
            return x;
        }
    }
    return a;
}

var a = f();
console.log(a[0]());
console.log(a[1]());
console.log(a[2]());

打印出 3, 3, 3。我不明白为什么。我正在将“i”的值复制到局部变量 x,因此应该有三个 x:x0=0、x1=1。 x2=2。他们如何读取 i 的最终值?

最佳答案

您的问题是由每个 a[i] 实际上是一个闭包引起的。它们都共享相同的 i,它在调用每个 a[i] 时计算,而不是在循环执行时计算。您需要使用单独的上下文创建每个闭包。例如:

function f() {
    var a = [];
    var i;
    for (i = 0; i < 3; i++) {
        a[i] = makeClosure(i);
    }
    return a;
}
function makeClosure(i) {
    return function () {
        var x = i;
        return x;
    }
}

关于javascript - Javascript 中的闭包 : assigning local variable doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16765366/

相关文章:

lisp - 闭包和动态作用域?

php - Laravel 中的闭包是什么?

javascript - 如何使用 AJAX 和 JSON 获取 PHP 文件返回的数据

javascript - 原型(prototype)的功能未定义

ios - 核心数据保存关闭

javascript - 确定函数在闭包 javascript 中是如何被调用的

java - 为什么在 Java 中不可能在内部匿名类中引用非最终变量?

javascript - 在以下控制流中使用响应之前,如何在 Node/快速应用程序中等待来自 mongo findOne 查询的响应

javascript - 使用 jstree 搜索插件为节点标题启用精确的多词搜索

javascript - NodeJS Cluster 意外的 assert.AssertionError