【问题标题】:Can I store JavaScript functions in arrays?我可以将 JavaScript 函数存储在数组中吗?
【发布时间】:2011-04-05 06:46:35
【问题描述】:

如何将函数存储在具有命名属性的数组中,这样我就可以像这样调用

FunctionArray["DoThis"]

甚至

FunctionArray[integer]

?


注意:我不想使用eval

【问题讨论】:

标签: javascript arrays function


【解决方案1】:

答案是有一个简单的答案,但它不会被这个线程中的答案简化。简单的答案是肯定的,您可以将函数放在数组中。事实上,可以在你的函数中声明变量并引用它们。

示例:

let a = 1;
let b = 2;

let arr = [
  a,
  b,
  function () {
    return a + b;
   },
  ];

console.log(arr[2]()); // return 3
console.log(typeof arr); // returns object

【讨论】:

    【解决方案2】:

    基本上,函数是 JavaScript 中的一种特殊类型的对象。在 JavaScript 中,您可以在数组中存储任何内容(不一定是相同类型)。因此,是的,您可以在 JavaScript 中将函数、对象和原始值存储在数组中:

    var arr = ["Hello", true, false, 1, {name: "Arshad"}, function(){}]
    

    你可以混合对象和函数来使命名函数像:

    { callBythisname: function(){ .... }}
    

    您也可以将此对象存储在数组中:

    var arr = [{ callBythisname: function(){ .... }}];
    

    如果你想调用它,调用如下:

    arr[0].callBythisname();
    

    【讨论】:

      【解决方案3】:

      您实际上可以做到这一点。只需在数组之外声明它,就像这样......

      const your_function = function(){ console.log("I am your function") }
      
      const group = [0, "lizard", false, your_function()]
      
      group[3]
      

      如果您愿意,也可以更改调用位置...

      const your_function = function(){ console.log("I am your function") }
      
      const group = [0, "lizard", false, your_function]
      
      group[3]()
      

      函数命名错误:/ sry

      【讨论】:

        【解决方案4】:

        这是一个包含各种数据类型的数组,包括一个函数。

        虽然本例中有一个对象,但函数不在对象之内。

        如果您将此对象替换为字符串,该函数仍将按计划工作。

        我可以在数组内部或外部调用函数。

        myArray = [
                1,
                true,
                "String",
                {
                    name: "trey",
                    age: 43,
                },
                [1,2,3,4],
                myFunction = function(){
                    console.log("What\'s up!");
                },
                myArray[5](),
            ];
            console.log(myArray);
            myArray[5]();
        

        这是输出:

        What's up!
        [ 1, true, 'String', { name: 'trey', age: 43 }, [ 1, 2, 3, 4 ], [Function], undefined ]
        What's up!
        

        【讨论】:

          【解决方案5】:

          您甚至可以使用函数作为属性的名称:

          var func = function(a, b){alert(a+b)};
          var obj = {};
          obj[func] = 2;
          

          【讨论】:

            【解决方案6】:

            您可以通过对象的名称 (x["A"]) 访问对象的属性。如果你想分配索引 (0 = "A") 你必须这样做,here is an example。 (我不确定for 循环是否适用于任何浏览器;我已经在 Firefox 上进行了测试,但您可以理解。)

            var x = {};
            
            x.A = function() { alert("func 1"); };
            x.B = function() { alert("func 2"); };
            
            
            var i = 0;
            for (a in x)
            {
                x[i] = x[a];
                ++i;
            }
            
            
            x[0](); // func 1
            x[1](); // func 2
            x["A"](); // func 1
            x["B"](); // func 2
            

            【讨论】:

            • 不要在那个循环之后期望x[0]x.Ax[1]x.Bfor … in 迭代 an arbitrary order 中对象的属性。但是你可以做类似x[0] = x.A; x[0]();的事情。
            • 你能重现它吗?我猜这个顺序并不是真的随意,它取决于你定义的顺序。至少我无法重现。
            • 顺序不是“任意的”,因为浏览器的实现倾向于按照定义的顺序进行。但这是浏览器的个人实施决定。根据规范,对象文字没有严格的顺序。因此,尽管代码可能会按照定义的顺序执行而没有任何负面工件,但您不一定要依赖它,因为浏览器可能会更改它们的实现,或者新的浏览器可能会进入不以这种方式实现的场景。
            【解决方案7】:

            你想要一个对象字面量,而不是一个数组。

            x = { 'dothis': function() { alert('hi'); } };
            

            对象

            x['dothis']()
            

            也可以动态调用

            y = 'dothis';
            x[y]()
            

            静态/硬编码调用:

            x.dothis()
            

            如果你确实想要一个数组:

            x = [function(){alert('hi');}][0]()
            

            【讨论】:

            • 这个答案是纯金。
            【解决方案8】:

            你可以将东西直接存储在一个数组中,但是作为一个对象,例如:

            var Functions = { DoThis: function() { alert("do this"); } };
            
            Functions['DoThis'](); //alerts "do this"
            Functions.DoThis()     //alerts "do this"
            

            You can give it a try here.

            【讨论】:

            • 嗯..谢谢!为什么这行不通? var FunctionArray = []; FunctionArray["m+"] = function(){...}
            • 嗯,当我说 FunctionArray["whatever"]();再次感谢
            • @Emre - 这是一个数组,要使其工作,只需创建一个对象,而不是使用 var FunctionArray = {}; 作为第一行 :)
            • @Emre – 您可以在数组中使用命名引用来存储函数,因为数组只是一种(特殊类型的)对象。您第一条评论中示例的问题是 + 在许多 JavaScript 实现中不是 valid character in an identifier
            【解决方案9】:

            要记住的重要一点是,函数是 JavaScript 中的第一类对象。因此,您可以将它们作为参数传递,将它们用作对象值等等。数组中的值只是其中一个示例。

            请注意,我们没有将函数存储在数组中,尽管我们可以这样做并使用数字索引访问它们。我们将它们存储在一个常规对象中,该对象以我们想要访问该函数的名称为键。

            var functions = {
                blah: function() { alert("blah"); },
                foo: function() { console.log("foo"); }
            };
            

            调用为

            functions.blah();
            

            functions["blah"]();
            

            【讨论】:

            • 如何在数组中的另一个函数中调用该数组中的函数
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-12-02
            • 1970-01-01
            • 1970-01-01
            • 2020-12-03
            • 1970-01-01
            • 1970-01-01
            • 2020-03-11
            相关资源
            最近更新 更多