Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.02.2014, 11:41
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

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

меня мучает один вопрос. методы apply и call. единственное различие, которое я нашел это как идет передача параметров, обычное перечисление или массив.. неужели надо было создавать два метода, когда в принципе можно обойтись одним?? или есть еще какие то нюансы о которых я не знаю?
Ответить с цитированием
  #2 (permalink)  
Старый 05.02.2014, 11:57
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus7
 
Регистрация: 08.01.2014
Сообщений: 354

skrudjmakdak

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

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


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

Последний раз редактировалось Maxmaxmaximus7, 05.02.2014 в 12:02.
Ответить с цитированием
  #3 (permalink)  
Старый 05.02.2014, 12:21
Профессор
Отправить личное сообщение для skrudjmakdak Посмотреть профиль Найти все сообщения от skrudjmakdak
 
Регистрация: 27.04.2012
Сообщений: 1,410

Уважаемый 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>

и объясните НОРМАЛЬНО, если можно с примерами, чем они различаются. т.к. я большой разницы пока не вижу....
Ответить с цитированием
  #4 (permalink)  
Старый 05.02.2014, 12:40
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

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 и т.д.);
}
__________________
kobezzza
code monkey

Последний раз редактировалось kobezzza, 05.02.2014 в 12:59.
Ответить с цитированием
  #5 (permalink)  
Старый 05.02.2014, 12:57
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от skrudjmakdak
[3, 5, 7]
У тебя в примере заранее известны все аргументы. В реале же число аргументов может быть разным и приходить ввиде массива. Как ты в таком случае обойдешься без apply?
Сообщение от kobezzza
apply - это просто сахар для call.
Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply (пожертвовав удобством и скоростью (потери на создании массива)).
__________________
В личку только с интересными предложениями

Последний раз редактировалось danik.js, 05.02.2014 в 12:59.
Ответить с цитированием
  #6 (permalink)  
Старый 05.02.2014, 12:58
Аватар для kobezzza
Быдлокодер;)
Отправить личное сообщение для kobezzza Посмотреть профиль Найти все сообщения от kobezzza
 
Регистрация: 19.11.2010
Сообщений: 4,338

Сообщение от danik.js Посмотреть сообщение
Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply.
Да, ты прав.

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

Последний раз редактировалось kobezzza, 05.02.2014 в 13:01.
Ответить с цитированием
  #7 (permalink)  
Старый 05.02.2014, 13:22
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus7
 
Регистрация: 08.01.2014
Сообщений: 354

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

Последний раз редактировалось Maxmaxmaximus7, 05.02.2014 в 13:24.
Ответить с цитированием
  #8 (permalink)  
Старый 05.02.2014, 13:22
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Сообщение от skrudjmakdak
Уважаемый Maxmaxmaximus7
так будет правильней
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #9 (permalink)  
Старый 05.02.2014, 13:26
Профессор
Посмотреть профиль Найти все сообщения от Maxmaxmaximus7
 
Регистрация: 08.01.2014
Сообщений: 354

skrudjmakdak, ты сказал что обе вещи для которых предназначены эти функции можно сделать одной из этих функций, продемонстрируй это.
Ответить с цитированием
  #10 (permalink)  
Старый 05.02.2014, 13:44
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

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

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

Последний раз редактировалось ruslan_mart, 05.02.2014 в 13:47.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
В чем отличие bind от call и apply? platedz Events/DOM/Window 11 08.04.2013 07:24
Практическое применние apply, call TicTac Общие вопросы Javascript 10 26.06.2011 12:18
apply и call. В чём отличия? B~Vladi Оффтопик 49 24.09.2009 10:35