Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/411.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中从数组调用函数的函数数组_Javascript_Arrays_Function - Fatal编程技术网

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出错的原因。:)我个人不喜欢这样做。