Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   apply and call in function (https://javascript.ru/forum/misc/44879-apply-call-function.html)

skrudjmakdak 05.02.2014 11:41

apply and call in function
 
Вопрос конечно смешной, дабы я уже довольно таки долго занимаюсь js, но все же...

меня мучает один вопрос. методы apply и call. единственное различие, которое я нашел это как идет передача параметров, обычное перечисление или массив.. неужели надо было создавать два метода, когда в принципе можно обойтись одним?? или есть еще какие то нюансы о которых я не знаю? :)

Maxmaxmaximus7 05.02.2014 11:57

skrudjmakdak

apply передает массив аргументов
call передает аргументы по отдельности.

ты говоришь что обе эти штуки может делать какой-то один из этих методов.
приведи пример когда какой-то один из этих методов делает обе эти штуки.


Цитата:

Сообщение от skrudjmakdak
дабы я уже довольно таки долго занимаюсь js

а вот в этом я сомневаюсь

skrudjmakdak 05.02.2014 12:21

Уважаемый Maxmaxmaximus7, в том что ты во мне сомневаешься - это твое личное мнение, не более, и держи его при себе. это так же как и я могу высказать свое мнение о тебе, смотря на твою репутацию... понимаешь о чем я? уважай других, не только самого себя..

Вот код:
<html>
	<head>
		<title>example</title>
	</head>
	<body>
		<script>
function myFunc(a, b, c)
	{
	var sumObj = this.p1 + this.p2,
		sumArgs = a + b + c;
	
	console.log(sumObj + sumArgs);
	}
	
var myObj = {
	p1: 5,
	p2: 8
	};

myFunc.call(myObj, 3, 5, 7);
myFunc.apply(myObj, [3, 5, 7]);
		</script>
	</body>
</html>

и объясните НОРМАЛЬНО, если можно с примерами, чем они различаются. т.к. я большой разницы пока не вижу....

kobezzza 05.02.2014 12:40

skrudjmakdak

function forEach(myArray) {
    myArray.forEach(...);
}

forEach.apply(forEach, [
    [1, 2, 3]
]);

forEach.call(forEach, 
    [1, 2, 3]
);


Немного помедитировав над кодом становится ясно, что apply не удобно использовать при передачи параметра-массива и забыв про это можно ловить забавные баги.

call - это просто сахар для apply.

function myFn() {
    fn.apply(fn, arguments);
}


вместо

function myFn(arg1, arg2, arg3 и т.д.) {
    fn(arg1, arg2, arg3 и т.д.);
}

danik.js 05.02.2014 12:57

Цитата:

Сообщение от skrudjmakdak
[3, 5, 7]

У тебя в примере заранее известны все аргументы. В реале же число аргументов может быть разным и приходить ввиде массива. Как ты в таком случае обойдешься без apply?
Цитата:

Сообщение от kobezzza
apply - это просто сахар для call.

Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply (пожертвовав удобством и скоростью (потери на создании массива)).

kobezzza 05.02.2014 12:58

Цитата:

Сообщение от danik.js (Сообщение 295963)
Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply.

Да, ты прав.

Кстати в ECMAScript6 можно будет делать так:
fn(...[1, 2, 3]);

Maxmaxmaximus7 05.02.2014 13:22

Цитата:

Сообщение от skrudjmakdak
держи его при себе

с чего это мне держать свое мнение при себе? ты выставил на публику информацию о том давно ты там или не давно ты там занимаешься чем-то. тебя ни кто за язык не тянул. ты выложел информацию - люди обсуждают эту информацию. не хотел публичности не выкладывай на всеобщее обсуждение. вопросы?

nerv_ 05.02.2014 13:22

Цитата:

Сообщение от skrudjmakdak
Уважаемый Maxmaxmaximus7

так будет правильней :)

Maxmaxmaximus7 05.02.2014 13:26

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

ruslan_mart 05.02.2014 13:44

Оба метода очень нужны.
Например, если мне нужно передать только одну переменную, то я воспользуюсь call'ом, а вот если несколько, то можно тоже call'ом, но иногда бывает (как сказал danik.js) количество передаваемых аргументов не известно, поэтому просто передаём массив через apply.

А сделать в одну не получится, так как например: Вы хотите, чтобы метод понимал, если ему передаётся массив, то используем как apply, а если нет, то - call. Ну а если мы передаём в ф-цию не массив аргументов, а просто массив как один аргумент?


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