Jscript - 函数名中的变量,可能吗?

时间:2014-04-05 19:28:24

标签: windows function variables jscript wsh

我在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调用函数?

1 个答案:

答案 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迭代对象的属性。

非常相似,但不一样。