Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   метод apply с двумя аргументами (https://javascript.ru/forum/css-html/51683-metod-apply-s-dvumya-argumentami.html)

serrrgggeee 15.11.2014 16:01

метод 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 тоесть текущий эллемент, только зачем он тут и как это все связать не пойму, только пожалуйста не отсылайте меня к мануалам, как работает это с одним аргументом я понял а как с двумя что то не доходит :no:

serrrgggeee 15.11.2014 17:22

извините что то я не понял, я хотел бы услышать разъяснение, вот на что в данном примере указывает this?

devote 15.11.2014 17:38

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 контекст является обязательным аргументом, потому и отдается вызывающей функции, текущий контекст области в которой происходит вызов.

danik.js 15.11.2014 17:43

Цитата:

Сообщение от serrrgggeee
вот на что в данном примере указывает this?

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

Да и не важно это, ибо this в этой функции вообще не используется.
Цитата:

Сообщение от serrrgggeee
другой this тоесть текущий эллемент

Какой еще текущий элемент? Первым аргументом в функцию apply или call передается контекст. В твоем примере просто прокидывается текущий контекст, каким бы он ни был. Что ты туда передашь вместо this - не имеет значения, ибо у тебя в функции this не используется.

serrrgggeee 15.11.2014 17:59

что то запутался тоесть в моем случае можно this опустить?

krutoy 15.11.2014 19:20

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


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