Javascript中闭包的替代语法:可能的缺点?

时间:2011-10-31 07:41:06

标签: javascript closures

我仍在与我的低智商作斗争: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的。

2 个答案:

答案 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(是数组的第六个元素)。