Re:接受未知#ARgs的JavaScript Fn - 调用Fn wrks - 通过var调用不会

时间:2016-08-07 15:53:16

标签: javascript function arguments this apply

学习如何编写接受未知数量参数的JS Fn。

function foo(a,b,c,d){
    //do something
    //return something
}

var bar = function () {
    var arg = Array.from(arguments);
    var lastIndx = arg.length;
    var parArray = arg.slice(1,lastIndx);
    var argMnts = arguments[0];
    return arguments[0].apply(this, parArray);
};

调用栏因此起作用:

bar(foo,1,4,3,7);

这样称呼它:

var tester = bar(foo,1,4,3,7);
tester();

结果:测试者不是一个功能

从我的研究中我怀疑它可能与"这个"的范围有关。或者参数,所以我将它们的值分配给变量,为变量提供了底层,结果是相同的。

非常感谢一些见解。

1 个答案:

答案 0 :(得分:2)

在您的示例中,调用bar()会返回调用foo(...)的结果。所以,如果你想做到这一点:

var tester = bar(foo,1,4,3,7);
tester();

然后,foo(...)必须返回另一个可以分配给tester的函数,然后可以再次调用。

如果您不希望bar(foo, ...)实际调用foo(),而是希望它返回一个函数,然后调用foo()适当的参数,您可以将bar()更改为:

var bar = function () {
    var args = Array.from(arguments);
    var fn = args.shift();
    var self = this;
    return function() {
        return fn.apply(self, args);
    }
};

var tester = bar(foo,1,4,3,7);
tester();

此处,bar()返回一个函数,(调用时)将调用foo()

或者,通过正确的ES6支持,您可以使用rest参数;

var bar = function (fn, ...args) {
    var self = this;
    return function() {
        return fn.apply(self, args);
    }
};

或者,您可以将.bind()与rest参数和spread运算符一起使用:

var bar = function (fn, ...args) {
    return fn.bind(this, ...args);
};