【问题标题】:Mutable variable is accessible from closure [duplicate]可变变量可以从闭包中访问[重复]
【发布时间】:2014-10-27 15:07:41
【问题描述】:

我有以下代码:

for (var i = 0; i < data.length; i++) {
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    }

但是我的编辑说“可变变量可以从闭包中访问”。我尝试将function(json) { 更改为function(json, file) {,但这不起作用,因为这是jquery 的默认功能。

希望你能帮我解决问题。

【问题讨论】:

标签: javascript jquery json variables


【解决方案1】:

对于此类循环,您需要将内容放入闭包中。

for (var i = 0; i < data.length; i++) {
    (function(){
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    })();
}

【讨论】:

  • 不客气。如果您需要进一步解释,请告诉我 ;)
  • 哦,du sprichst sogar Deutsch :)
  • @VanCoding:你能解释一下你的答案吗?从我的想法来看,这将阻止“i”的值被其他函数改变。是吗?
【解决方案2】:

您可以按照建议使用闭包,但它也不会使您的代码更易于阅读,尤其是当您的闭包在循环内时!简单地创建一个函数并在每次迭代中调用它会更容易和更简洁。

for (var i = 0; i < data.length; i++) {
    doJson(data[i]);
}

function doJson(file) {
    $.getJSON("/types/" + file, function(json) {
        if (json[0] !== undefined) {
            console.log(json[0] + file);
        }
    });
}

或者您可以简单地更新您的循环以改用forEach,因为每次迭代都会触发一个新函数,范围将受到限制。

data.forEach(function(file) {

    $.getJSON("/types/" + file, function(json) {
        if (json[0] !== undefined) {
            console.log(json[0] + file);
        }
    });
});

【讨论】:

  • 这些选项比公认的答案更清晰易读
【解决方案3】:

如果您可以使用 ES6,您可以简单地将 var 替换为 let,一切都会按预期进行,因为 let 在 for 循环的每次迭代中都会创建一个新范围。

for (let i = 0; i < data.length; i++) {
        var file = data[i];
        $.getJSON("/types/" + file, function(json) {
            if (json[0] !== undefined) {
                console.log(json[0] + file);
            }
        });
    }

【讨论】:

    【解决方案4】:

    你应该使用闭包:(在循环中运行函数时要小心)。

    for (var i = 0; i < data.length; i++)
    {
        var file = data[i];
    
        (function(f)
        {
    
            $.getJSON("/types/" + f, function(json)
            {
                if (json[0] !== undefined)
                {
                    console.log(json[0] + f);
                }
            })
        })(file);
    
    
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-18
      • 1970-01-01
      • 1970-01-01
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 2013-12-30
      • 2016-09-15
      相关资源
      最近更新 更多