我在WSH Jscript中的数组中有一个函数名,我需要在循环中调用它们。 Al我发现的是Javascript - Variable in function name, possible?,但这不起作用,可能是因为我使用WSH和/或从控制台运行脚本,而不是浏览器。
var func = [
'cpu'
];
func['cpu'] = function(req){
WScript.Echo("req="+req);
return "cpu";
}
for (var item in func) {
WScript.Echo("item="+ func[item](1));
}
结果是:
C:\test>cscript b.js
Microsoft (R) Windows Script Host Version 5.6
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
C:\test\b.js(11, 2) Microsoft JScript runtime error: Function expected
(这是WScript.Echo行)
那么,在这个环境中有没有办法在变量中使用name调用函数?
答案 0 :(得分:2)
不,问题不在于WSH不是命令行。
这是您的代码中的内容:
var func = [
'cpu'
];
即一个包含一个元素的数组。元素的内容为'cpu',其索引为0.数组长度为1。
func['cpu'] = function(req){
WScript.Echo("req="+req);
return "cpu";
}
这会向数组对象添加aditional属性,而不是数组内容的一个元素。如果测试,则数组长度仍为1.
for (var item in func) {
WScript.Echo("item="+ func[item](1));
}
这会迭代数组的内容。 item
检索数组中每个元素的索引,然后用于检索内容。但是数组的内容只是一个元素,索引0及其内容是一个字符串(cpu
)。它不是一个功能,所以,你不能称之为。
问题是你正在混合使用对象的方式和使用数组的方式。
对于数组版本
var func = [
function cpu(req){
return 'called cpu('+req+')';
},
function other(req){
return 'called other('+req+')';
}
];
func.push(
function more(req){
return 'called more('+req+')';
}
);
for (var item in func) {
WScript.Echo('calling func['+item+']='+ func[item](1));
};
对象版本
var func = {
cpu : function(req){
return 'called cpu('+req+')';
},
other : function(req){
return 'called other('+req+')';
}
};
func['more'] = function(req){
return 'called more('+req+')';
};
for (var item in func) {
WScript.Echo('calling func['+item+']='+ func[item](1));
};
正如您所看到的,非常相似,但如果您使用数组,那么您应该向数组添加元素,而不是属性,因为for in
将迭代数组中的元素。在对象方法的情况下,您向对象添加属性,for in
迭代对象的属性。
非常相似,但不一样。