Javascript 闭包解释与代码示例

标签 javascript closures

我正在尝试理解 javascript 闭包。我读了一个示例代码:

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

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]();
}

此代码将打印“item3 undefined”警报 3 次。我确实理解第 5 行 item 变量中的“3”,但我不明白为什么它会从第 5 行的 list[i] 中打印出“undefined”?这不也是使用闭包来访问列表变量吗?有人能解释一下吗?

最佳答案

您确实可以访问所有这些变量。问题是您的 i 变量在以下循环中:

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

i 通过引用传递,并且每次循环都会增加。因此,在将闭包插入循环 3 次之后,i 的值为 4,并且每个回调都会尝试警告 [1,2,3] (您提供的数组)的第四个元素,该元素是未定义的。

关于Javascript 闭包解释与代码示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12767953/

相关文章:

javascript - 如何在使用 &lt;script type ="module"> 加载的 HTML 中调用函数?

javascript - 向原生 JavaScript 对象添加方法

javascript - 参数对应: callback vs.闭包(?)

swift - [weak self] 情况下的快捷闭包语法

JavaScript 闭包 - 程序流程

rust - 如何基于作为参数传递的闭包的返回类型来更改函数的行为?

javascript - iOS Webkit 只读输入可选择吗?

java - 如何在 java(struts) 中保留下拉列表的选定值

javascript - 我正在制作我的作品集,我想使用 Spotify API 来显示我当前正在收听的内容,但不想使用“播放”按钮

c# - 依赖于访问修改后的闭包的实现是否不可取?