Javascript 为什么这个闭包示例不正确?
我看到过闭包的例子,我认为我理解它们,直到我决定这样做:Javascript 为什么这个闭包示例不正确?,javascript,Javascript,我看到过闭包的例子,我认为我理解它们,直到我决定这样做: var f = []; for (var i = 0; i < 2; i++) { f[i] = function foo(a) { var h = i; function bar() { console.log(h); } if (a == 1) bar(); } } for (var j = 0; j
var f = [];
for (var i = 0; i < 2; i++) {
f[i] = function foo(a) {
var h = i;
function bar() {
console.log(h);
}
if (a == 1)
bar();
}
}
for (var j = 0; j < 2; j++) {
console.log(f[j](1));
}
当我认为它应该是0,1
时,因为我创建了一个外部函数foo
,我将I
存储在变量h
有人能解释一下这里发生了什么,以及为什么那些
setTimeout
示例工作正常吗?对于所需的输出,请将代码更新为以下内容
var f = [];
for (var i = 0; i < 2; i++) {
f[i] = (function(i){
return function foo(a) {
var h = i;
function bar() {
console.log(h);
}
if (a == 1)
bar();
}
})(i);
}
for (var j = 0; j < 2; j++) {
console.log(f[j](1));
}
var f=[];
对于(变量i=0;i<2;i++){
f[i]=(函数(i){
返回函数foo(a){
var h=i;
功能条(){
控制台日志(h);
}
如果(a==1)
bar();
}
})(i) );
}
对于(var j=0;j<2;j++){
console.log(f[j](1));
}
您没有设置超时
呼叫吗?是高度相关的,可能是重复的。只有在实际调用函数时才将i
赋值给h
。当时i
已经是2了。@Yoshi Ok现在我知道了。其实很简单。非常感谢。
var f = [];
for (var i = 0; i < 2; i++) {
f[i] = (function(i){
return function foo(a) {
var h = i;
function bar() {
console.log(h);
}
if (a == 1)
bar();
}
})(i);
}
for (var j = 0; j < 2; j++) {
console.log(f[j](1));
}