Re: JavaScript Fn, который принимает неизвестный # args-вызов FN wrks-вызов через var, не делает
Учимся писать 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();
Результаты: тестер-это не функция
Из моего исследования я предположил, что это может быть связано с областью действия "это" или аргументов, поэтому я присвоил их значения переменным, вложил vars, и результат был тот же. Некоторая проницательность была бы чрезвычайно оценена.1 ответ:
В вашем примере вызов
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); };