【问题标题】:Jscript - Variable in function name, possible?Javascript - 函数名称中的变量,可能吗?
【发布时间】:2014-04-05 19:28:23
【问题描述】:

我在 WSH Jscript 的数组中有一个函数名,我需要循环调用它们。 我在这里找到了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 行)

那么,在这种环境下,有没有办法使用变量中的名称来调用函数呢?

【问题讨论】:

    标签: windows function variables jscript wsh


    【解决方案1】:

    不,问题不在于 WSH 而不是命令行。

    这是您的代码中的内容:

    var func = [
        'cpu'
    ];
    

    即一个包含一个元素的数组。元素的内容是'cpu',它的索引是0。数组长度是1。

    func['cpu'] = function(req){
        WScript.Echo("req="+req);
        return "cpu";
    }
    

    这会向数组对象添加一个附加属性,而不是向数组内容添加一个元素。如果你测试,数组长度仍然是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 会迭代对象的属性。

    非常相似,但又不一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多