学习如何编写接受未知数量参数的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();
结果:测试者不是一个功能
从我的研究中我怀疑它可能与"这个"的范围有关。或者参数,所以我将它们的值分配给变量,为变量提供了底层,结果是相同的。
非常感谢一些见解。
答案 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);
};