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