【问题标题】:How can I fix this closure within a list function?如何在列表函数中修复此闭包?
【发布时间】:2016-02-28 20:43:40
【问题描述】:

very good Stack Overflow answer 提供了一个示例,说明在返回列表中的匿名函数时,闭包如何直观地反作用。

function buildList(list) {
    var result = [];
    for (var i = 0; i < list.length; i++) {
        var item = 'item' + i;
        result.push( function() {alert(item + ' ' + list[i])} );
    }
    return result;
}

function testList() {
    var fnlist = buildList([1,2,3]);
    // Using j only to help prevent confusion -- could use i.
    for (var j = 0; j < fnlist.length; j++) {
        fnlist[j]();
    }
}

此代码将返回:

item2 undefined
item2 undefined
item2 undefined

我的问题是 - 您将如何修改此代码以使其返回我们期望的结果?

item0 1
item1 2
item2 3

【问题讨论】:

    标签: javascript closures anonymous-function


    【解决方案1】:

    buildListfor 循环中使用IIFE 并传入i

    这将确保传入的i 将保持在IIFE 闭包中,并且不会被for 循环中的i 更改

    function buildList(list) {
      var result = [];
      for (var i = 0; i < list.length; i++) {
        //the IIFE
        (function(i) {
          var item = 'item' + i;
          result.push(function() {
            console.log(item + ' ' + list[i])
          });
        })(i);
      }
      return result;
    }
    
    function testList() {
      var fnlist = buildList([1, 2, 3]);
      // Using j only to help prevent confusion -- could use i.
      for (var j = 0; j < fnlist.length; j++) {
        fnlist[j]();
      }
    }
    
    testList();

    【讨论】:

    • 非常感谢。看起来您发布的链接解释得很好。 :)
    • @dwjohnston,很高兴它有帮助
    猜你喜欢
    • 2021-10-09
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-29
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多