2017-02-28 67 views
-1

所以我想创建一个function阵列调用一个函数从基阵

  1. 这需要在一个字符串数组
  2. 这些字符串转换为功能
  3. 然后能从数组调用时返回功能

到目前为止,我的代码如下所示:

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; 
} 

当我通过这个function

var strings = ['One', 'Two', 'Three', 'Four', 'Five']

然而,当我尝试这个数组传递给我的函数像这样的数组:

var functionalArrayPositionOne = funcArrays(strings)

我得到这样的:

Uncaught ReferenceError: One is not defined at eval (eval at funcArrays (:5:14), <anonymous>:2:30) at guestListFns (<anonymous>:8:18) at <anonymous>:1:9

而我希望能够做的是这样的:

var functionalArrayPositionOne = funcArrays(strings)

那么做到这一点: functionalArrayPositionOne[0]()

而且有这个返回function's输出

+0

对不起,如果我错过了,但'guestListFns(字符串)'在哪里? –

+0

此外,在这一行'新函数( “返回函数(num){return”+“”+ name +“;};” )()'你正在调用你创建的函数,所以你没有函数 –

+0

好的结果我改变了所有的名字 –

回答

0

这就是你'之后?

而且我也有兴趣知道为什么想要这样做?

var numbers = ['one', 'two', 'three']; 

function functionise(values) { 
    return values.map(function (value) { 
    return function() { 
     return value; 
    }; 
    }); 
} 

functions = functionise(numbers); 

console.log(functions[0]()); // one 
console.log(functions[1]()); // two 
console.log(functions[2]()); // three 
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; 
} 
  1. 你打电话给你刚才创建的功能,因此你必须返回的值,而不是这似乎是你要求的功能。

  2. 如果使用函数构造函数,将无法访问在范围中创建的变量。所以你得到了Uncaught ReferenceError: One is not defined


function funcArrays(stringArray){ 
    var funcArray = []; 
    for(var i in stringArray){ 
    var func = function() { 
     var name = stringArray[i]; 
     return function() { //[1] 
     return (function() { //[2] 
      return name //[3] 
     })() 
     } 
    } 
    funcArray.push(func()); 
    } 
    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]

+1

为什么有必要使用'Function'构造函数呢? – 2017-02-28 02:59:23

+0

这不是,我只是指出OP为什么会出现这个错误。 :)我个人不喜欢这样做。 –

0

你最终执行的函数实际上是

function(num) { return One; } 

,是的,One确实是不确定的,因此你的错误。如果你想在函数返回'One',那么你需要写:

var func = new Function(
    "return function(num){ return '" + name + "'; };" 
)(); 

注单引号。像你想这将产生一个功能:

function(num) { return 'One'; } 

顺便说一句,在这种情况下,往往更具可读性使用模板字符串:

`return function(num) { return '${name}'; }` 

但实际上,你并不需要使用Function构造函数完全可以创建函数;我们已经有function关键字来做到这一点。因此,而不是

var func = new Function(
    "return function(num){ return"+" "+name+"; };" 
)(); 

只要写

但是,如果你仔细想想,你定义它返回一个函数的函数,然后立即执行该功能,这是完全一样的刚指定函数本身,所以

var func = function(num) { return name; }; 

因为你是在一个循环中跨strings这样做,这是一个很好的应用map,让你写你的整个功能:

function funcArrays(stringArray){ 
    return stringArray.map(string => function(num) { return string; }); 
} 

采取更注重功能的做法,常常是有用写higher-order function它创建了一个函数,它总是返回一些特殊的价值。有时候,这种功能被称为K

function K(v) { return function() { return v; } 

,或者,如果你喜欢

const K = v =>() => v; 

现在你可以写你funcArrays功能仅仅作为

function funcArrays(stringArray) { 
    return stringArray.map(K); 
} 

在一般情况下,很少有在这种情况下,您将需要使用构造函数从字符串中创建一个函数Function。如果你尝试,你会经常发现自己困惑和麻烦。使用Function构造函数具有与使用eval大部分相同的问题,并且同样存在问题。除其他问题外,您只能从创建的函数中访问全局变量(或参数)。