Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.12.2016, 10:32
Аспирант
Отправить личное сообщение для slavAAvals Посмотреть профиль Найти все сообщения от slavAAvals
 
Регистрация: 08.12.2016
Сообщений: 49

Частичное применение без bind
Добрый день, господа.
Прошу помочь разобраться с задачей на частичное применение.

http://dkab.github.io/jasmine-tests/?spec=5

Да, я — начинающий: что-то умею, что-то получается плоховато.
Помогите разобраться с этим примером, буду премного благодарен.
Ответить с цитированием
  #2 (permalink)  
Старый 08.12.2016, 12:11
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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
Ответить с цитированием
  #3 (permalink)  
Старый 08.12.2016, 12:38
Аспирант
Отправить личное сообщение для slavAAvals Посмотреть профиль Найти все сообщения от slavAAvals
 
Регистрация: 08.12.2016
Сообщений: 49

Спасибо. Осталось разобраться вот в этом моменте:
params = Array.prototype.slice.call(arguments);

Ответить с цитированием
  #4 (permalink)  
Старый 08.12.2016, 13:15
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

slavAAvals, так как arguments является псевдомассивом и у него нет таких методов как shift, concat и т.д., нам нужно превратить его в нормальный массив с помощью вот такого хитрого хака.
Ответить с цитированием
  #5 (permalink)  
Старый 08.12.2016, 17:46
Аспирант
Отправить личное сообщение для slavAAvals Посмотреть профиль Найти все сообщения от slavAAvals
 
Регистрация: 08.12.2016
Сообщений: 49

А как быть с этой?)
Думал, что начал понимать, как попался на простые задачи и решил только первые парочку)

http://dkab.github.io/jasmine-tests/?spec=6
Ответить с цитированием
  #6 (permalink)  
Старый 08.12.2016, 18:03
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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
Ответить с цитированием
  #7 (permalink)  
Старый 08.12.2016, 18:30
Аспирант
Отправить личное сообщение для slavAAvals Посмотреть профиль Найти все сообщения от slavAAvals
 
Регистрация: 08.12.2016
Сообщений: 49

ох, мамочки)

Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мой простой движок магазина без цен или витрины sovsem-nub Ваши сайты и скрипты 12 31.10.2016 17:59
AJAX навигация без якоря(Требуется помощ) Radik55rus AJAX и COMET 11 14.08.2014 10:34
событье onclick как вызвать без клика и без подозрений... Александр_1997 Events/DOM/Window 0 21.06.2014 17:38
bind и unbind но без jquery syegorius Events/DOM/Window 1 04.12.2011 13:09
Открытие нового окна без скролбаров без верхнего бара "файл правка вид и тп" Mara Общие вопросы Javascript 2 18.02.2010 15:11