我仍在与我的低智商作斗争:D 这是关闭时通常的臭名昭着的循环:
function r(){
var a = [];
var i;
for(i=0;i<10;i++){
a[i]=(function(x){
return function(){return x;}
})(i);
return a;
}
现在我很清楚这一点。 为了更好地理解闭包,我使用了代码并提出了:
function r(){
var a = [];
var i;
for(i=0;i<10;i++){
a[i] = (function(){
var x=i;
return function(){return x;}
})();
}
return a;
}
我的代码完全等同于吗?
Merc的。
答案 0 :(得分:2)
我的代码完全等同吗?
是
我发现第二种方式更容易阅读,因为它可以节省必须查看立即执行的函数的结尾,以找出作为参数传入的内容(不是像这样的短函数的大问题) ),但第一种方式更紧凑,可能更常见,所以......
答案 1 :(得分:2)
我猜你没有尝试过,第一个甚至没有用!使用firebug来测试你的代码。这是第一个示例的版本,它实际上没有给出错误:
function r() {
var a = [];
var i;
for (i=0; i<10; i++) {
a[i] = (function (x) {
return function () {
return x;
}
})(i);
}
return a;
}
因此,在添加缺少的右括号之后,它们是等价的,它们构建了一个函数数组,它们将数字从0返回到9,它们不构建从0到9的数字数组。例如,调用r()[5]();
返回5(是数组的第六个元素)。