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 2

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);
};