【发布时间】:2011-04-05 06:46:35
【问题描述】:
如何将函数存储在具有命名属性的数组中,这样我就可以像这样调用
FunctionArray["DoThis"]
甚至
FunctionArray[integer]
?
注意:我不想使用eval。
【问题讨论】:
标签: javascript arrays function
如何将函数存储在具有命名属性的数组中,这样我就可以像这样调用
FunctionArray["DoThis"]
甚至
FunctionArray[integer]
?
注意:我不想使用eval。
【问题讨论】:
标签: javascript arrays function
答案是有一个简单的答案,但它不会被这个线程中的答案简化。简单的答案是肯定的,您可以将函数放在数组中。事实上,可以在你的函数中声明变量并引用它们。
示例:
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
【讨论】:
基本上,函数是 JavaScript 中的一种特殊类型的对象。在 JavaScript 中,您可以在数组中存储任何内容(不一定是相同类型)。因此,是的,您可以在 JavaScript 中将函数、对象和原始值存储在数组中:
var arr = ["Hello", true, false, 1, {name: "Arshad"}, function(){}]
你可以混合对象和函数来使命名函数像:
{ callBythisname: function(){ .... }}
您也可以将此对象存储在数组中:
var arr = [{ callBythisname: function(){ .... }}];
如果你想调用它,调用如下:
arr[0].callBythisname();
【讨论】:
您实际上可以做到这一点。只需在数组之外声明它,就像这样......
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
【讨论】:
这是一个包含各种数据类型的数组,包括一个函数。
虽然本例中有一个对象,但函数不在对象之内。
如果您将此对象替换为字符串,该函数仍将按计划工作。
我可以在数组内部或外部调用函数。
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!
【讨论】:
您甚至可以使用函数作为属性的名称:
var func = function(a, b){alert(a+b)};
var obj = {};
obj[func] = 2;
【讨论】:
您可以通过对象的名称 (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.A和x[1]是x.B; for … in 迭代 an arbitrary order 中对象的属性。但是你可以做类似x[0] = x.A; x[0]();的事情。
你想要一个对象字面量,而不是一个数组。
x = { 'dothis': function() { alert('hi'); } };
对象
x['dothis']()
也可以动态调用
y = 'dothis';
x[y]()
静态/硬编码调用:
x.dothis()
如果你确实想要一个数组:
x = [function(){alert('hi');}][0]()
【讨论】:
你可以将东西直接存储在一个数组中,但是作为一个对象,例如:
var Functions = { DoThis: function() { alert("do this"); } };
Functions['DoThis'](); //alerts "do this"
Functions.DoThis() //alerts "do this"
【讨论】:
var FunctionArray = {}; 作为第一行 :)
+ 在许多 JavaScript 实现中不是 valid character in an identifier。
要记住的重要一点是,函数是 JavaScript 中的第一类对象。因此,您可以将它们作为参数传递,将它们用作对象值等等。数组中的值只是其中一个示例。
请注意,我们没有将函数存储在数组中,尽管我们可以这样做并使用数字索引访问它们。我们将它们存储在一个常规对象中,该对象以我们想要访问该函数的名称为键。
var functions = {
blah: function() { alert("blah"); },
foo: function() { console.log("foo"); }
};
调用为
functions.blah();
或
functions["blah"]();
【讨论】: