Частичное применение без bind
Добрый день, господа.
Прошу помочь разобраться с задачей на частичное применение. http://dkab.github.io/jasmine-tests/?spec=5 Да, я — начинающий: что-то умею, что-то получается плоховато. Помогите разобраться с этим примером, буду премного благодарен. :help: |
function partial(fn) { var context = this, //Сохраняем текущий контекст params = Array.prototype.slice.call(arguments); //Преобразуем аргументы в нормальный массив с помощью такого хака params.shift(); //Убираем первый аргумент, так как он у нас уже есть в качестве "fn" и дальше не нужен return function() { //Возвращаем новую ф-цию var params2 = Array.prototype.slice.call(arguments); //Дополнительные параметры также преобразуем в массив var newParams = params.concat(params2); //Склеиваемзабинденные параметры + дополнительные (текущие); return fn.apply(context, newParams); //Вызываем "fn" с сохранённым контекстом и с склеенными параметрами } } function mult(a, b, c, d) { return a * b * c * d; } var mult23 = partial(mult, 2, 3); // мы зафиксировали первые 2 аргумента mult() как 2 и 3 alert(mult23(4, 5)); // 2*3*4*5 = 120 alert(mult23(1, 1)); // 2*3*1*1 = 6 |
Спасибо. Осталось разобраться вот в этом моменте:
params = Array.prototype.slice.call(arguments); :-? |
slavAAvals, так как arguments является псевдомассивом и у него нет таких методов как shift, concat и т.д., нам нужно превратить его в нормальный массив с помощью вот такого хитрого хака. :)
|
А как быть с этой?)
Думал, что начал понимать, как попался на простые задачи и решил только первые парочку) http://dkab.github.io/jasmine-tests/?spec=6 |
function partialAny(fn) { var context = this, //Сохраняем текущий контекст params = Array.prototype.slice.call(arguments); //Преобразуем аргументы в нормальный массив с помощью такого хака params.shift(); //Убираем первый аргумент, так как он у нас уже есть в качестве "fn" и дальше не нужен return function() { //Возвращаем новую ф-цию var params2 = Array.prototype.slice.call(arguments); //Дополнительные параметры также преобразуем в массив var newParams = params.slice(); for(var i = 0; i < newParams.length; i++) { if(newParams[i] === void 0) { newParams[i] = params2.shift(); } } newParams = newParams.concat(params); return fn.apply(context, newParams); } } function test(a, b, c) { return 'a=' + a + ',b=' + b + ',c=' + c; } var test1_3 = partialAny(test, 1, undefined, 3); alert(test1_3(5)); // a=1,b=5,c=3 |
ох, мамочки)
:blink: |
Часовой пояс GMT +3, время: 05:30. |