将函数参数映射到变量(如果它们存在)

时间:2013-12-28 23:54:24

标签: javascript function arguments

我正在尝试开发一个带有四个参数的函数

  1. view(字符串)* minimum
  2. params(对象)
  3. code(功能)*最低
  4. callback(功能)
  5. 我希望能够通过我能够通过的最少量的功能,并在需要时与其他功能建立起来。

    例如,这些都应该起作用

    myFunction("enter", {"hello": "world"}, function(x){return x}, function(err, result){});
    myFunction("enter", function(x){return x}});
    myFunction("enter", {"hello": "world"}, function(x){return x}});
    myFunction("enter", {"hello": "world"});
    

    可以理解最后两个参数是函数我必须选择一个作为优先级。最后一个不是必需的,所以这永远不可能:

    myFunction("enter", {"hello": "world"}, function(err, result){});
    

    如果有一个函数参数myFunction会假设/优先考虑其中一个。该应用程序将处理错误。

    这是我尝试过的,这是一个很头疼的问题。

    如果声明声明功能并更改它们

    if(!arguments[0]) view = arguments[0];
    if(!arguments[1]) params = arguments[1];
    if(!_.isObject(arguments[1])){
        params = false;
        code = arguments[1];
        callback = arguments[2];
    };
    

    每个参数的功能

    var view = function(){
        if(!arguments[0]) return false;
        return arguments[0];
    }();
    
    var params = function(){
        if(!arguments[1]) return false;
        if(!_.isObject(arguments[1])) return false;
        return arguments[1];
    }();
    
    var code = function(){
        if(!arguments[1]) return false;
        if(!params) return arguments[1];
        if(!arguments[2]) return false;
        return arguments[2];
    }();
    
    var callback = function(){
        //if(!arguments)
    }
    

    问题:那里有没有可以帮助我的图书馆?

    请不要告诉我使用对象传递所有内容,我已经知道该怎么做了!

1 个答案:

答案 0 :(得分:1)

Underscore有一些实用工具可以试图弄清楚你有什么样的东西:

如果您愿意,也可以使用typeofinstanceof测试。然后你可以使用Function.length来尝试区分函数参数。

这样你就可以用这样简单的东西来解析arguments

var view, params, code, callback, arg;
for(var i = 0; i < arguments.length; ++i) {
    arg = _(arguments[i]);
    if(arg.isString())
        view = arguments[i];
    else if(arg.isFunction() && arguments[i].length === 1)
        code = arguments[i];
    else if(arg.isFunction() && arguments[i].length === 2)
        callback = arguments[i];
    else if(arg.isObject())
        params = arguments[i];
    else
        throw 'WTF is argument ' + i + ' all about?';
}

您可以根据需要调整测试(特别是length检查),您可能需要单独测试以确保指定了所需的参数。当然,这不需要任何特定的参数顺序,但它确实期望完全按照要求指定函数;请注意,许多函数包装工具(_.bind$.proxy,CoffeeScript的=>,...)将会执行length这样的事情,所以这类事情非常脆弱。< / p>

演示:http://jsfiddle.net/ambiguous/94sgp/

我在现实生活中使用一个物体,命名的东西远远超过猜测。