Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите разобраться, как реализовать данный метод? (https://javascript.ru/forum/misc/41379-pomogite-razobratsya-kak-realizovat-dannyjj-metod.html)

Sannn 11.09.2013 12:45

Помогите разобраться, как реализовать данный метод?
 
Реализовать метод foo, чтобы код работал.
function bar(a, b){
    return a + b;
}

var x = foo(bar, 1);
x(2); // 3
var y = foo(bar, 2, 5);
y(); // 7


Пытался сделать несколько методов foo под разное кол-во переменных, но не вышло.

Яростный Меч 11.09.2013 12:58

Sannn,

ищи по словам Function.prototype.bind

devote 11.09.2013 13:02

function foo(fn) {
    var args = Array.prototype.slice.call(arguments, 1);
    return function() {
        return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
    }
}


function bar(a, b){
    return a + b;
}
 
var x = foo(bar, 1);
alert(x(2)); // 3
var y = foo(bar, 2, 5);
alert(y()); // 7

devote 11.09.2013 13:03

Цитата:

Сообщение от Яростный Меч
ищи по словам Function.prototype.bind

не подойдет, бинд не только складывает аргументы, но и привязывает к контексту.. где первый его параметр является контекстом

Sannn 11.09.2013 17:55

Спасибо, но можно пару вопросов?
var args = Array.prototype.slice.call(arguments, 1);

Вот это строкой мы делаем массив из аргументов, кроме 1ого.
return function() {
    return fn.apply(this, args.concat(Array.prototype.slice.call(arguments)));
}

А вот эта строчка чуть-чуть запутала. Мы возвращаем функцию, которая возвращает результат функции bar, вызывая ее в контексте чего? При этом передаем функции bar это: мы к массиву args добавляем весь массив аргументов arguments. Можно подробно рассказать этот момент, я запутался. Пожалуйста.


Часовой пояс GMT +3, время: 07:07.