Javascript不需要的闭包行为

Javascript不需要的闭包行为,javascript,Javascript,可能重复: 我试图编写类似的代码: var funcs = []; for (var i=0; i<5 ; ++i) { funcs[i]=function() { alert(i); }; } 这样做的技巧,但似乎真的令人费解和难以阅读。有没有更好的方法可以在不使用函数包装器的情况下获得预期的行为?当您不想用这些匿名函数嵌入代码时,解决方案是定义命名类,在原型中嵌入状态i和函数。这更容易理解,但有时更易读: var funcs = []; functi

可能重复:

我试图编写类似的代码:

var funcs = [];
for (var i=0; i<5 ; ++i) {
    funcs[i]=function() {
        alert(i);
    };
}

这样做的技巧,但似乎真的令人费解和难以阅读。有没有更好的方法可以在不使用函数包装器的情况下获得预期的行为?

当您不想用这些匿名函数嵌入代码时,解决方案是定义命名类,在原型中嵌入状态i和函数。这更容易理解,但有时更易读:

var funcs = [];
function MyFunc(i) {
   this.i=i;
}
MyFunc.prototype.doIt = function(){
   alert(this.i);
};
for (var i=0; i<5 ; ++i) {
    funcs[i]=new MyFunc(i);
}

funcs[2].doIt();​

当您不想用这些匿名函数嵌入代码时,一个解决方案是在原型中定义嵌入状态i和函数的命名类。这更容易理解,但有时更易读:

var funcs = [];
function MyFunc(i) {
   this.i=i;
}
MyFunc.prototype.doIt = function(){
   alert(this.i);
};
for (var i=0; i<5 ; ++i) {
    funcs[i]=new MyFunc(i);
}

funcs[2].doIt();​
该函数允许您将其他参数预绑定到绑定函数:

var funcs = [];
for (var i=0; i<5 ; ++i) {
    funcs[i]=function(i) {
        alert(i);
    }.bind(this, i);
}
这是一个ES5函数,因此应适用于IE9+、Chrome、Safari、Firefox:

该函数允许您将其他参数预绑定到绑定函数:

var funcs = [];
for (var i=0; i<5 ; ++i) {
    funcs[i]=function(i) {
        alert(i);
    }.bind(this, i);
}

这是一个ES5函数,所以应该可以在IE9+、Chrome、Safari、Firefox上使用:

您应该尽可能简单地编写它。我认为这很容易理解,但很难阅读。所以简化它的一种方法是使用嵌套编码样式。我不认为它会比现在更简单

我建议这样做:

var funcs = [];

for (var i = 0; i < 5; ++i) {
    funcs[i] = (
        function (cap) {
            return function () { alert(cap) };
        }
    )(i);
}

你应该写得尽可能简单。我认为这很容易理解,但很难阅读。所以简化它的一种方法是使用嵌套编码样式。我不认为它会比现在更简单

我建议这样做:

var funcs = [];

for (var i = 0; i < 5; ++i) {
    funcs[i] = (
        function (cap) {
            return function () { alert(cap) };
        }
    )(i);
}

IMHO,出于性能和可读性方面的原因,命名函数通常更优越。为什么不这样做:

function foo (cap) {
    return function () { alert(cap) };
}

var funcs = [];
for (var i=0; i<5 ; ++i) {
    funcs[i]=foo(i);
}

IMHO,出于性能和可读性方面的原因,命名函数通常更优越。为什么不这样做:

function foo (cap) {
    return function () { alert(cap) };
}

var funcs = [];
for (var i=0; i<5 ; ++i) {
    funcs[i]=foo(i);
}
试试这个:

var funcs = [0, 1, 2, 3, 4].map(function(i) {
    return function() {alert(i);};
});
注意:IE8及更高版本不支持map,但有一个解决方案。

试试这个:

var funcs = [0, 1, 2, 3, 4].map(function(i) {
    return function() {alert(i);};
});


注意:IE8及更高版本不支持map,但有一个解决方案。

不能使用funcs[i].i=i;在函数语句之后?无法重新创建Chrome 21/Mac 10.7 Nop,因为在我正在处理的实际情况中,作用域设置为调用函数funcs[I]。callsomeObject。。。这将覆盖这个,这个。我将无法访问。JavaScript作用域位于函数级别。因此,当您在另一个函数中创建函数时,它们共享父函数局部变量。用{}打开一个块不会创建新的作用域,就像它在C++或java中所做的那样。@这是因为当您调用每个函数时,您处于for循环中,并且将i的值更改为正确的值。将您的第二个变量更改为使用另一个变量,它将不起作用。你不能使用funcs[i]吗。i=i;在函数语句之后?无法重新创建Chrome 21/Mac 10.7 Nop,因为在我正在处理的实际情况中,作用域设置为调用函数funcs[I]。callsomeObject。。。这将覆盖这个,这个。我将无法访问。JavaScript作用域位于函数级别。因此,当您在另一个函数中创建函数时,它们共享父函数局部变量。用{}打开一个块不会创建新的作用域,就像它在C++或java中所做的那样。@这是因为当您调用每个函数时,您处于for循环中,并且将i的值更改为正确的值。将您的第二个变量更改为使用另一个变量,它将不起作用。因为你需要写一个顶级函数,而这个函数在其他任何地方都不会用到。乔恩:它不一定是顶级的,它只需要在范围内。当然,我的表达是错误的;假装它不在那里。这仍然是不理想的,这是一种不喜欢的技术,例如创建类来模拟C++和C.等语言中的闭包,它们都添加了lambdas,这样就不必编写这种机械代码。理想是主观的。显然,@sitifensys认为匿名关闭并不理想。我们为什么要争论这个?我们不是。我刚才回答了你的反问句,表达了一个观点。因为你需要写一个顶级函数,而这个函数在其他任何地方都没有用过?乔恩:它不一定是顶级的,它只需要在范围内。当然,我的表达是错误的;假装它不在那里。这仍然是不理想的,这是一种不喜欢的技术,例如创建类来模拟C++和C.等语言中的闭包,它们都添加了lambdas,这样就不必编写这种机械代码。理想是主观的。显然,@sitifensys认为匿名关闭并不理想。我们为什么要争论这个?我们不是。我只是发表了一个观点来回答你的反问。我几乎写了一个这样的答案,但后来决定[0,1,2,3,4,…]不可缩放…@Alnitak我知道那种感觉,兄弟。我只是想展示一些不同的东西。这都属于某种数组生成算法。可能是拆分字符串,或者创建Uint8Array,或者
不管怎样……啊,现在我可以解:Array.range=函数fm,n,z{return m,我几乎写了这样一个答案,但后来决定[0,1,2,3,4,…]不可缩放…@Alnitak我知道那种感觉,兄弟。我只是想展示一些不同的东西。这些都属于某种数组生成算法。可能是拆分字符串,或者创建Uint8Array,或者其他什么……啊,现在我可以解出:array.range=函数fm,n,z{return m IE仍然不是真正的浏览器:p just trollingIE仍然不是真正的浏览器:p just trolling