JavaScript将数组转换为函数数组

JavaScript converting an array to array of functions

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

你好,我正在处理一个问题,该问题要求我将一组数字数组更改为一个数组,该数组将原始数字作为函数返回。因此,我们得到了a2的返回,而不是a[2]。

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

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())) 
}

演示

基本上,它从最后一个数字中弹出一个数字,用返回的数字构建一个函数,然后放回数组的第一个。在一个完整的周期之后,所有这些都是函数。

问题是:这是如何工作的,由你来研究

为什么循环看起来不像直接的弹出取消:

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;

这里有三个重要步骤:

  • 从数组中提取数值。在具有i迭代器的循环中,它可能看起来像这样:

    var num = numArray[i];

  • 这一点很重要,因为i将不会保留创建新函数时的值——一旦for循环完成,它将以最后一个值结束。函数本身可能看起来像这样:

    function() { return num; }

  • 不再引用i,这很重要——为了更好地理解,请阅读关于闭包的内容。最后一步是将新函数添加到所需的函数数组中。

你完了!

编辑:请参阅其他人的答案,以获得如何正确执行此操作的良好解释,我也会通过修复我的答案

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

因此,在下面你可以看到(以及在这里的其他答案中)作用域函数可以帮助解决这样的问题。

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中的函数可以被命名为变量,并按如下方式传递:)