Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.11.2014, 16:01
Аспирант
Отправить личное сообщение для serrrgggeee Посмотреть профиль Найти все сообщения от serrrgggeee
 
Регистрация: 15.08.2014
Сообщений: 46

метод apply с двумя аргументами
Здравствуйте есть функция
function flexisum(a) {
	var total = 0;
	for(var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (!element) continue; // Игнорировать значения null и undefined

		// Попытаться преобразовать аргумент в число n исходя из типа аргумента
		var n;
		switch(typeof element) {
		case "number":
			n = element;
			// Преобразование не требуется
			break;
		case "object":
			if (element instanceof Array) // Рекурсивный обход массива
				n = flexisum.apply(this, element);
			else n = element.valueOf( ); // Для других объектов вызвать valueOf
			break;
		case "function":
			n = element( ); // Попытаться вызвать функцию
			break;
		case "string":
			n = parseFloat(element); // Попытаться преобразовать строку
			break;
		case "boolean":
			n = NaN; // Логические значения преобразовать невозможно
			break;
		}
		// Если было получено нормально число – добавить его к сумме.
		if (typeof n == "number" && !isNaN(n)) total += n;
		// В противном случае сгенерировать исключение
		else
			throw new Error("sum(): ошибка преобразования " + element + " в число");
	}
	return total;
}


здесь есть момент где вызывается рекурсивный вызов функции и там же применяется метод apply n = flexisum.apply(this, element); я понимаю что здесь применяется фунция apply и она предназначена для масивов в отличии от call ей передается два оргумента один element определенный как массив а другой this тоесть текущий эллемент, только зачем он тут и как это все связать не пойму, только пожалуйста не отсылайте меня к мануалам, как работает это с одним аргументом я понял а как с двумя что то не доходит
Ответить с цитированием
  #2 (permalink)  
Старый 15.11.2014, 17:22
Аспирант
Отправить личное сообщение для serrrgggeee Посмотреть профиль Найти все сообщения от serrrgggeee
 
Регистрация: 15.08.2014
Сообщений: 46

извините что то я не понял, я хотел бы услышать разъяснение, вот на что в данном примере указывает this?
Ответить с цитированием
  #3 (permalink)  
Старый 15.11.2014, 17:38
что-то знаю
Отправить личное сообщение для devote Посмотреть профиль Найти все сообщения от devote
 
Регистрация: 24.05.2009
Сообщений: 5,176

flexisum(1, 2, 3);
flexisum.call(this, 1, 2, 3);
flexisum.apply(this, [1, 2, 3]);

Все эти три варианта вызова, идентичны. apply этот вызов функции с аргументами, где аргументы перечислены в массиве, в отличии от простых вызовов, где каждый аргумент нужно перечислять.

например:
function test(a, b, c) {
  alert("a: " + a + ", b: " + b + ", c: " + c);
}
test(1, 2, 3); // a: 1, b: 2, c: 3
test.call(this, 1, 2, 3); // a: 1, b: 2, c: 3
test.apply(this, [1, 2, 3]); // a: 1, b: 2, c: 3


Что же такое this? Это контекст в котором выполняется функция, просто вызывая функцию через call/apply контекст является обязательным аргументом, потому и отдается вызывающей функции, текущий контекст области в которой происходит вызов.
__________________
хм Russians say завтра but завтра doesn't mean "tomorrow" it just means "not today."
HTML5 history API рассширение для браузеров не поддерживающих pushState, replaceState
QSA CSS3 Selector Engine
Ответить с цитированием
  #4 (permalink)  
Старый 15.11.2014, 17:43
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от serrrgggeee
вот на что в данном примере указывает this?
Это неизвестно. Зависит от того, как ты вызываешь функцию. Если просто как flexisum(x), то указывает на глобальный объект (window).

Да и не важно это, ибо this в этой функции вообще не используется.
Сообщение от serrrgggeee
другой this тоесть текущий эллемент
Какой еще текущий элемент? Первым аргументом в функцию apply или call передается контекст. В твоем примере просто прокидывается текущий контекст, каким бы он ни был. Что ты туда передашь вместо this - не имеет значения, ибо у тебя в функции this не используется.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 15.11.2014, 17:59
Аспирант
Отправить личное сообщение для serrrgggeee Посмотреть профиль Найти все сообщения от serrrgggeee
 
Регистрация: 15.08.2014
Сообщений: 46

что то запутался тоесть в моем случае можно this опустить?
Ответить с цитированием
  #6 (permalink)  
Старый 15.11.2014, 19:20
Профессор
Посмотреть профиль Найти все сообщения от krutoy
 
Регистрация: 09.11.2014
Сообщений: 610

serrrgggeee,
Можешь заменить на null или любой объект.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кастомный метод для элемента выборки. Casufi jQuery 7 26.09.2013 18:43
Наследование вызовом родителя. Метод apply() jsuse Общие вопросы Javascript 0 09.02.2012 23:54
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Общие вопросы Javascript 1 13.04.2011 22:09
Объект не поддерживает это свойство или метод load_081112_0953.js 1auto1 Internet Explorer 1 13.04.2011 21:59
Добавить свой метод к элементу alekciy Events/DOM/Window 6 16.02.2009 19:29