数组到函数数组

array to an array of functions

本文关键字:数组 函数      更新时间:2023-09-26

可能重复:
循环中的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;
}
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

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

请注意,现有的答案都不起作用;它们都将产生返回CCD_ 2中最后一个值的函数。var是函数范围的,与闭包的交互很差。

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

什么是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; }; 
}

工作Fiddle:http://jsfiddle.net/eFWyf/