Javascript中从数组调用函数的函数数组
所以我想创建一个Javascript中从数组调用函数的函数数组,javascript,arrays,function,Javascript,Arrays,Function,所以我想创建一个函数: 它接受一个字符串数组 将这些字符串转换为函数 然后在从数组调用时能够返回该函数 到目前为止,我的代码如下所示: function funcArrays(stringArray){ var funcArray = []; for(var i in stringArray){ var name = stringArray[i]; var func = new Function( "retur
函数
:
function funcArrays(stringArray){
var funcArray = [];
for(var i in stringArray){
var name = stringArray[i];
var func = new Function(
"return function(num){ return"+" "+name+"; };"
)();
funcArray.push(func());
}
return funcArray;
}
当我传递这个函数时
一个字符串数组
var strings=['1','2','3','4','5']
但是,当我尝试像这样将此数组传递给我的函数时:
function funcArrays(stringArray){
var funcArray = [];
for(var i in stringArray){
var name = stringArray[i];
var func = new Function(
"return function(num){ return"+" "+name+"; };"
)();
funcArray.push(func());
}
return funcArray;
}
var functionallarraypositionone=funcarray(字符串)
我明白了:
未捕获引用错误:未定义一个
评估时(评估时的数组(:5:14),:2:30)
在宾客登记处(:8:18)
时间:1:9
我想做的是:
var functionallarraypositionone=funcarray(字符串)
然后这样做:
functionalRayPositionOne[0]()
并返回函数的
输出您的错误是因为:
function funcArrays(stringArray){
var funcArray = [];
for(var i in stringArray){
var name = stringArray[i];
var func = new Function(
"return function(num){ return"+" "+name+"; };"
)(); // this call
funcArray.push(func());
// here you end up calling 'One' which is not a function
}
return funcArray;
}
您正在调用刚刚创建的函数,因此您得到的是返回值,而不是您需要的函数
如果使用函数构造函数,则无法访问在作用域中创建的变量。因此您得到了未捕获引用错误:一个未定义
可以这样使用:
var functionalArrayPositionOne = funcArrays(['One', 'Two', 'Three'])[0]
functionalArrayPositionOne()
// prints 'One'
但为什么有3个功能
如果你看穿了这个案子:
var func = function () {
return function () {
return name
}
}
funcArray中的值应为:
function () {
return name
}
在整个循环执行之后,您将看到name
的最后一个值
因此,为了冻结name
的值,我使用了一个IIFE[2]函数,您最终执行的函数实际上是
function(num) { return One; }
是的,One
确实是未定义的,因此您的错误。如果希望函数返回字符串'One'
,则需要编写:
var func = new Function(
"return function(num){ return '" + name + "'; };"
)();
请注意单引号。这将生成您想要的函数:
function(num) { return 'One'; }
顺便说一下,在这种情况下,使用模板字符串通常更具可读性:
`return function(num) { return '${name}'; }`
但实际上,您根本不需要使用函数
构造函数来创建函数;我们已经有了函数
关键字来实现这一点。所以不是
var func = new Function(
"return function(num){ return"+" "+name+"; };"
)();
只要写
var func = function() {
return function(num) { return name; };
}();
但是,如果您仔细想想,您正在定义一个返回函数的函数,然后立即执行该函数,这与只指定函数本身完全相同,所以
var func = function(num) { return name; };
由于您是在跨越字符串的循环中执行此操作的,因此它是映射
的良好应用程序,允许您将整个函数编写为:
function funcArrays(stringArray){
return stringArray.map(string => function(num) { return string; });
}
为了采用更实用的方法,编写一个函数来创建一个总是返回某些特定值的函数通常是有用的。有时这种函数称为K
:
function K(v) { return function() { return v; }
或者,如果你愿意的话
const K = v => () => v;
现在您可以编写funcArrays
函数
function funcArrays(stringArray) {
return stringArray.map(K);
}
通常,很少情况下需要使用函数
构造函数从字符串创建函数。如果你试图这样做,你会发现自己经常感到困惑和麻烦。使用函数
构造函数的问题与使用eval
的问题大部分相同,并且同样存在问题。除其他问题外,您只能从这样创建的函数中访问全局变量(或参数)。如果我错过了,很抱歉,guestListFns(strings)
?此外,在这一行新函数(“返回函数(num){return”+“”+name+“;};”()
您正在调用您创建的函数,因此您没有函数好的捕获我更改了所有的名称为什么需要使用函数
构造函数?不是,我只是指出OP出错的原因。:)我个人不喜欢这样做。