如何在JavaScript中实现函数数组?

How can I implement an array of functions in JavaScript?

本文关键字:函数 数组 实现 JavaScript      更新时间:2023-09-26

我还是个JavaScript新手。我需要编码一个20 x 20矩阵的函数对。我所有的函数都接受一个数字并返回一个数字(即相同的签名)。例如,Myfunctions[1][2]应该返回给我一对可以在代码中调用的函数。

在Java中,我通常会实现一个包含20 x 20个对象的数组,每个对象将实现两个函数。但是,这在JavaScript中可能吗?如果没有,我应该如何继续得到类似的东西?如果我需要两个矩阵来模拟配对,这也是可以的。

由于函数在JavaScript中是对象,因此您可以很容易地定义它们的数组。

function foo () { ... }
function bar () { ... }
function baz () { ... }
var fns = [foo, bar, baz];

签名根本不重要。


从这里开始,你可以在循环中动态地生成函数,而不是显式地声明每个函数:

function generator(n)
{
    return function ()
    {
        return n*n;
    };
}
var squareFuncs = [];
for (var i=0; i<10; i++)
{
    squareFuncs.push(generator(i));
}

然后您可以构建函数数组的数组(就像任何其他对象一样,记住):

function anotherGenerator(a, b)
{
    return function ()
    {
        return a+b;
    };
}
var sumFuncs = [],
    temp,
    i,
    j;
for (i=0; i<20; i++)
{
    temp = [];
    for (j=0; j<20; j++)
    {
        temp.push(anotherGenerator(i, j));
    }
    sumFuncs.push(temp);
}

现在sumFuncs是一个二维数组(实际上是数组的数组)的函数,它计算该函数在矩阵中的坐标和。这听起来可能比实际情况更复杂,所以这里有一个例子:

var foo = sumFuncs[7][2],
    sum = foo();
console.log(sum); // prints 9

相关:

  • 我可以在数组中存储JavaScript函数吗?
  • Javascript函数数组

在ECMAscript中你不能真正拥有一个矩阵数组结构,但是你可以创建数组的数组:

function o1() {};
function o2() {};
function o3() {};
function o4() {};
function o5() {};
function o6() {};
var Myfunctions = [
    [ o1, o2 ],
    [ o3, o4 ],
    [ o5, o6 ]
];
现在

Myfunctions[0][1]();

将执行上面示例中的o2函数。

您可以创建一个包含两个函数的对象,并将其放入数组中。

Myfunctions[1][2] = { 
    first: function(val) { return val + 1; }
    second: function(val) { return val - 1; }
};
firstVal = Myfunctions[1][2].first(100);
secondVal = Myfunctions[1][2].second(100);

考虑使用函数工厂:

function makeFunction(one, two) {
  return function () {
    ...
  }
}
makeFunction(1,2);
// Not functionMatrix[1][2]

这是一个包含函数对的二维数组:

几乎所有的函数都是匿名函数,除了一个用来告诉你如何工作的。

你可以这样使用:var myresult = myFuncs[2][3].func1(45);

function extern2ArrayFunc (a) {
  return a+;
}
var myFuncs = [
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : exter2ArrayFunc },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ],
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ],
    [ { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      },
      { "func1" : function (a) { return a+1; },
        "func2" : function (b) { return b-1; }
      }
    ]
  ];