您好我正在处理一个问题,需要我将一组数字更改为一个数组,该数组将原始数字作为函数返回。所以我们得到a2而不是[2]的回报。
我不想要答案我只需要一个提示。我知道我可以遍历数组并使用.pop()来获取数组的最后一个值,但后来我不知道如何将它转换为函数。任何提示?
答案 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()))
}
基本上它从最后一个弹出一个数字,构建一个返回该数字的函数,并放回到数组的第一个。经过一个完整周期后,所有这些都是功能。
这里有一个问题:这是如何运作的,由你来研究
为什么循环看起来不像直接的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中的函数可以命名为变量,并且这样传递:)