代码之家  ›  专栏  ›  技术社区  ›  clemesha

检查JavaScript函数定义/执行中的参数名称/值

  •  20
  • clemesha  · 技术社区  · 16 年前

    inspect.getargspec() 在Javascript中。

    我知道你可以得到 arguments 名字 从最初定义的函数中获取参数。

    myFunc.toString() ... function myFunc(...) 有人知道如何以一般的方式进行解析吗?

    谢谢你的建议。

    5 回复  |  直到 16 年前
        1
  •  24
  •   Jonathan Fingland    16 年前

    虽然我看不出有什么好的理由,

    var reg = /\(([\s\S]*?)\)/;
    var params = reg.exec(func);
    if (params) 
         var param_names = params[1].split(',');
    

    假设 func 是您的函数名称

        2
  •  5
  •   Jack Allan    13 年前

    以下函数将返回传入的任何函数的参数名数组。

    function getParamNames(func) {
        var funStr = func.toString();
        return funStr.slice(funStr.indexOf('(')+1, funStr.indexOf(')')).match(/([^\s,]+)/g);
    }
    

    示例用法:

    getParamNames(getParamNames) // returns ['func']
    getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']
    
        3
  •  4
  •   kilianc    14 年前

    这里有一个小的nodejs模块。

    https://github.com/kilianc/node-introspect

        4
  •  0
  •   Ionuț G. Stan    16 年前

    这是一个使用高阶函数的版本。我唯一不喜欢的是,你必须将参数指定为数组的成员。但至少它们只需要指定一次。

    <!DOCTYPE html>
    
    <html>
    <head>
    <meta charset="UTF-8">
    <title></title>
    <script type="text/javascript">
    var withNamedParams = function(params, lambda) {
        return function() {
            var named = {};
            var max   = arguments.length;
    
            for (var i=0; i<max; i++) {
                named[params[i]] = arguments[i];
            }
    
            return lambda(named);
        };
    };
    
    var foo = withNamedParams(["a", "b", "c"], function(params) {
        for (var param in params) {
            alert(param + ": " + params[param]);
        }
    });
    
    foo(1, 2, 3);
    </script>
    </head>
    <body>
    
    </body>
    </html>
    
        5
  •  -1
  •   Community Mohan Dere    8 年前

    乔纳森·芬格兰答案的明显改进版本:

    // Utility function to extract arg name-value pairs
    function getArgs(args) {
        var argsObj = {};
    
        var argList = /\(([^)]*)/.exec(args.callee)[1];
        var argCnt = 0;
        var tokens;
    
        while (tokens = /\s*([^,]+)/g.exec(argList)) {
            argsObj[tokens[1]] = args[argCnt++];
        }
    
        return argsObj;
    }
    
    // Test subject
    function add(number1, number2) {
        var args = getArgs(arguments);
        alert(args.toSource()); // ({number1:3,number2:4})
    }
    
    // Invoke test subject
    add(3, 4);
    

    注意:这仅适用于支持以下功能的浏览器 arguments.callee .

    (也张贴在 How to get function parameter names/values dynamically from javascript )