回复:A JavaScript Fn 接受未知的#args - 调用 Fn wrks - 通过 var 调用不

Re: A JavaScript Fn that accepts unknown # args - call Fn wrks - call via var does not

学习如何编写接受未知数量参数的 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();

结果:tester 不是函数

根据我的研究,我怀疑它可能与 "this" 或参数的范围有关,所以我将它们的值分配给变量,替换变量,结果是一样的。

一些见解将不胜感激。

在您的示例中,调用 bar() returns 无论调用 foo(...) 的结果是什么。所以,如果你想能够做到这一点:

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

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


如果,而不是上面的方式,如果您不希望 bar(foo, ...) 实际调用 foo(),而是希望它 return 一个函数,然后调用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() return 是一个函数,(调用时)将调用 foo()


或者,在正确的 ES6 支持下,您可以使用剩余参数;

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

或者,您可以将 .bind() 与剩余参数和扩展运算符一起使用:

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