Javascript 关闭不起作用?

标签 javascript closures

我知道这看起来很傻。但是刚才我尝试在JS中测试closure

var funcList = [];
for(let i = 0; i < 3; ++i) {
  funcList.push(() => { console.log(i); });
}
console.log('testing for reference');
funcList.forEach(func => func());

funcList.length = 0;
for(let i = 0; i < 3; ++i) {
  funcList.push(
  ((i) => { 
    return () => { console.log(i); }
  })()
  );
}
console.log('testing for no reference');
funcList.forEach(func => func());

但不幸的是,我遇到了如下问题:

预期的输出应该是(至少我是这么认为的~~,事实很可能是我错了):

testing for reference
3
3
3
testing for no reference
0
1
2

但它给了我

testing for reference
0
1
2
testing for no reference
undefined
undefined
undefined

这里发生了什么?任何人都可以照亮我吗?

非常感谢您提供任何可能有用的建议。

更新 2018-3-24 感谢@Patrick Evans 它现在工作如下:

var funcList = [];
for(var i = 0; i < 3; ++i) { // using var instead of let
  funcList.push(() => { console.log(i); });
}
console.log('testing for reference');
funcList.forEach(func => func());

funcList.length = 0;
for(var i = 0; i < 3; ++i) {
  funcList.push(
  ((i) => { 
    return () => { console.log(i); }
  })(i) // pass in the `i`
  );
}
console.log('testing for no reference');
funcList.forEach(func => func());

2018-03-30 更新

真正的闭包应该是

var funcList = [];
(function () {
    let i = 0;
    while (i++ < 3) {
        funcList.push(() => { console.log(i); });
    }
})();
console.log('testing for reference');
funcList.forEach(func => func());

最佳答案

您忘记将 i 的值传递给需要参数的函数。由于参数没有值,因此它记录未定义。试试这个:

funcList.push(
  ((i) => { 
    return () => { console.log(i); }
  })(i) //Pass i's value as param
  );

关于Javascript 关闭不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49461014/

相关文章:

Javascript 内联工作但不能在文件中工作

javascript - 文本区域按键不起作用

Javascript 创建对象结构

javascript - jQuery.ajax() 中的范围问题

javascript - 从 get 获取空数组

javascript - IE 6 7 不显示弹出窗口的问题,它在其他 brwsrs 中工作正常

javascript - 访问闭包变量

javascript - 向现有模块化模式对象添加新方法

javascript - Node js :Not able to catch 'error' in ssh2 connection on MacOSx/Linux

Javascript:是为所有变量创建闭包,还是仅为内部函数可能使用的变量创建闭包?