您好,我正在解决一个问题,该问题需要我将一组数字更改为一个将原始数字作为函数返回的数组。所以我们得到了 a2 而不是 a[2] 的返回值。
我不想要答案,我只需要一个提示。我知道我可以遍历数组并使用 .pop() 来获取数组的最后一个值,但是我不知道如何从那里将其转换为函数。任何提示?
您好,我正在解决一个问题,该问题需要我将一组数字更改为一个将原始数字作为函数返回的数组。所以我们得到了 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()))
}
基本上它从最后一个数字中弹出一个数字,用返回的数字构建一个函数,然后放回数组的第一个。一个完整的循环后,它们都是函数。
问题是:这是如何工作的,由你来研究
为什么循环看起来不像简单的 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;
这里有三个重要步骤:
从数组中提取数值。在带有 的迭代器的循环中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中的函数可以命名为变量,并且可以这样传递:)