JavaScript将数组转换为函数数组

时间:2012-04-05 03:42:08

标签: javascript arrays function

您好我正在处理一个问题,需要我将一组数字更改为一个数组,该数组将原始数字作为函数返回。所以我们得到a2而不是[2]的回报。

我不想要答案我只需要一个提示。我知道我可以遍历数组并使用.pop()来获取数组的最后一个值,但后来我不知道如何将它转换为函数。任何提示?

3 个答案:

答案 0 :(得分:1)

var numToFun = [1, 2, 3];
var numToFunLength = numToFun.length;

for (var i = 0; i < numToFunLength; i++) {
    (function(num){
        numToFun.unshift(function() {
            return num;
        });
    }(numToFun.pop())) 
}

DEMO

基本上它从最后一个弹出一个数字,构建一个返回该数字的函数,并放回到数组的第一个。经过一个完整周期后,所有这些都是功能。

这里有一个问题:这是如何运作的,由你来研究

为什么循环看起来不像直接的pop-unshift:

for (var i = 0; i < numToFunLength; i++) {
    numToFun.unshift(function() { //put into first a function
        return numToFun.pop()     //that returns a number
    });
}

为什么我这样做:(提示:表现)

var numToFunLength = numToFun.length;

答案 1 :(得分:1)

这里有三个重要步骤:

  • 从数组中提取数字值。在迭代器为i的循环中,它可能如下所示:

    var num = numArray[i];

  • 这很重要,因为i不会保留其创建新函数时的值 - 一旦for,它将以最后一个值结束循环结束了。函数本身可能如下所示:

    function() { return num; }

  • 不再提及i,这很重要 - 要更好地理解,请阅读closures。最后一步是将新函数添加到您想要的函数数组中。

......你已经完成了!

答案 2 :(得分:0)

编辑:请参阅其他答案以获得有关如何正确执行此操作的详细说明,我也会修复我的

正如其他人所指出的那样,许多人在努力解决javascript中的一个棘手问题(显然我自己包括在内)是javascript中的范围变量与许多其他语言不同;范围几乎完全由函数定义,而不是像for循环那样的{}块,如java / C所示。

因此,您可以在下面看到(以及此处的其他答案)范围函数可以帮助解决此类问题。

var numArray = [12, 33, 55];
var funcArray = [];
var numArrLength = numArray.length; // Don't do this in for loop to avoid the check multiple times
for(var j=0; j < numArrLength; j++) {
    var scopeMe = function() {
        var numToReturn = numArray[j];
        console.log('now loading... ' + numToReturn);
        var newFunc = function() {
           return numToReturn;
        };
        return newFunc;
   }();
   funcArray.push(scopeMe);
};
console.log('now me');
console.log(funcArray);

console.log(funcArray[0]());
console.log(funcArray[1]());
console.log(funcArray[2]());
console.log(funcArray[1]()); // To ensure it's repeatable

编辑下面的旧答案

您想要做的事情就像是

var funcArray = [];
for(...) {

   var newFunc = function() {
     return numArray.pop();

   }
   funcArray.push(newFunc); 
}

这里的关键是javascript中的函数可以命名为变量,并且这样传递:)