0

可能重复:
循环内的 Javascript 闭包 - 简单的实际示例

你有一个任意值的数组。在全局范围内编写一个转换函数,将数组转换为返回原始值的函数数组,因此我们将调用 a3,而不是调用 a[3]。

例如我想要:

var a = ["a", 24, { foo: "bar" }];
var b = transform(a);

a[1]; // 24
b[1](); // 24

但是我得到:

b
[function () { 
              return this.temp;
         }, function () { 
              return this.temp;
         }, function () { 
              return this.temp;
         }]

这是我的代码:

var a = ["a", 24, { foo: "bar" }];

var b = transform(a);

document.writeln(a[1]); // 24
document.writeln(b[0]()); // 24
document.writeln(b[1]()); // 24

function transform(array) {

  b = [];
  var i;
     for (i = 0; i < array.length; i += 1) {
        b[i] = function () { 
          return temp;
        };
     }
  return b;
}
4

4 回答 4

1
function transform(array) {

  b = [];
  var i;
  for (i = 0; i < array.length; i += 1) {
    b[i] = (function (x) { 
              return function () { return x; };
            })(array[i]);
  }
  return b;
}

演示 http://jsbin.com/udasoj/1/edit

于 2013-01-15T03:47:34.673 回答
0

如果你调用你的代码是正确b[0]()的,那么你应该得到返回的值。

于 2013-01-15T03:45:04.093 回答
0

是什么temp?看起来实现这一点的方法是通过另一个函数生成函数:

function transform(array) {
  b = [];
  var i;
  for (i = 0; i < array.length; i += 1) {
     b[i] = createReturnFunction(a[i]);
    };
  }

  return b;
}

function createReturnFunction(value){
  return function(){ return value; }; 
}

工作小提琴:http: //jsfiddle.net/eFWyf/

于 2013-01-15T03:46:14.230 回答
0

请注意,现有的答案都不会奏效;它们都将生成返回最后一个值的函数avar是函数范围的并且与闭包的交互很差。

请参阅我刚刚写的另一个答案,它解释了一个类似的问题:https ://stackoverflow.com/a/14330595/17875

于 2013-01-15T03:55:59.033 回答