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. Ну а если мы передаём в ф-цию не массив аргументов, а просто массив как один аргумент?

Maxmaxmaximus7 05.02.2014 13:46

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

типа .apply(arr) и .apply([1,2,3]) ну так некрасиво, лишние скобочки в которых нет нужды. по этому сделали чтобы без них было.

ruslan_mart 05.02.2014 13:55

Цитата:

Сообщение от Maxmaxmaximus7
типа .apply(arr) и .apply([1,2,3]) ну так некрасиво, лишние скобочки в которых нет нужды. по этому сделали чтобы без них было.

+
В массиве передавать один-два аргумента будет реально не удобно.

function fn(a, b, c) {
   fn.apply(null, [a, c]);
   //fn.call(null, a, c);
}

function fn2(a, b) {
   alert(a + b);
}

fn(2, null, 3);


С call'ом на три символа меньше, да и работает он вроде быстрее, если не ошибаюсь.

kobezzza 05.02.2014 14:01

Цитата:

Сообщение от Ruslan_xDD (Сообщение 295987)
+
В массиве передавать один-два аргумента будет реально не удобно.

function fn(a, b, c) {
   fn.apply(null, [a, c]);
   //fn.call(null, a, c);
}

function fn2(a, b) {
   alert(a + b);
}

fn(2, null, 3);


С call'ом на три символа меньше, да и работает он вроде быстрее, если не ошибаюсь.

function fn(a, ...args) {
   fn.apply(null, args);

   // ну или бюджетный способ
   fn.apply(null, [].slice.call(arguments, 1));
}

function fn2(a, b) {
   alert(a + b);
}

fn(2, null, 3);


Казалось бы разницы нет, но в случае добавления новых аргументов в fn2 нам не придётся добавлять их и в call, т.е. код с apply более короткий гибкий и удобный.

А скорость в таких вещах - это последнее на что нужно смотреть, т.к. разница там мизерна, и 99.99% что это не критическое место в вашем приложении и оптимизация этого места не будет даже заметна.

skrudjmakdak 05.02.2014 14:10

Отвечаю Maxmaxmaximus7, дабы он яркая персона...
Цитата:

Сообщение от Maxmaxmaximus7 (Сообщение 295971)
с чего это мне держать свое мнение при себе?

Потому что это не красиво.
Я сказал, что занимаюсь давно, но есть пробел в этой теме и хочу его заполнить. И это не означает что я полный нуб. усек?
Я последнее. я не хочу выяснять отношения. мне нужен всего лишь ответ на вопрос. учись как отвечают danik.js и kobezzza, нормально и без публичных обсужений.


Отвечаю kobezzza
Цитата:

Сообщение от kobezzza (Сообщение 295960)
apply не удобно использовать при передачи параметра-массива и забыв про это можно ловить забавные баги.

ммм. не понял. забыть что в apply передается массив, а не список?? это как??)))) имхо, но это тоже самое как забыть разницу между setTimeout и setInterval.... Или может я мысль не правильно понял))



Отвечаю danik.js
Цитата:

Сообщение от danik.js (Сообщение 295963)
У тебя в примере заранее известны все аргументы. В реале же число аргументов может быть разным и приходить ввиде массива. Как ты в таком случае обойдешься без apply?

ммм. вот это интересно...

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

kobezzza 05.02.2014 14:18

skrudjmakdak, такое ощущение, что ты не читал всё что здесь написали. Если ты не понимаешь в чём разница и где что применять, то ты правда ещё совсем зелёный (обижаться на это глупо).

skrudjmakdak 05.02.2014 14:20

пока писал дофига мне написали..

Maxmaxmaximus7 05.02.2014 14:30

Цитата:

Сообщение от skrudjmakdak
И это не означает что я полный нуб. усек

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

Цитата:

Сообщение от skrudjmakdak
я не хочу выяснять отношения. мне нужен всего лишь ответ на вопрос.

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

Maxmaxmaximus7 05.02.2014 14:34

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

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

skrudjmakdak 05.02.2014 14:40

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

kobezzza 05.02.2014 14:48

Делаю последнюю попытку объяснить и тоже сливаюсь:

У тебя есть массив, в нём хз сколько элементов, задача найти максимальный элемент. Вспоминаешь про Math.max:

// Пример
Math.max(1, 2, 3, 4, 5);


Вспоминаешь про .apply

var myArray = [хз сколько элементов];

// Урра всё работает!
Math.max.apply(null, myArray);


После этого примера (при условии, что ты его понял) внезапно обнаруживаешь, что таких случаев очень много и самый частый из них это написание фасадов (см. пример что я давал выше).

Всё, я удаляюсь.

Maxmaxmaximus7 05.02.2014 14:54

skrudjmakdak, ну, а зачем ты сказал что занимаешься давно если не хотел обсуждать это?

Цитата:

Сообщение от kobezzza
Всё, я удаляюсь.

нет ты ни куда не уходишь ты будешь читать срач в этой теме, заклинаю)

kobezzza 05.02.2014 14:58

Цитата:

Сообщение от Maxmaxmaximus7 (Сообщение 296009)
нет ты ни куда не уходишь ты будешь читать срач в этой теме, заклинаю)

аааа, меня заколдовал злой маг Волан де Максимус, теперь я не могу уйти из треда:D

skrudjmakdak 05.02.2014 14:58

Админы извините, но он меня вывел. Maxmaxmaximus7, ты блять далбаеб. я тебе 5ый раз говорю. объясни нормально. ты не понимаешь.

я не понял того момента, зачем передавать массив, когда обычно вызывая функцию передают набор аргументов. danik.js норм объяснил, я понял. что аргументы могут приходить в виде массива. он сказал одно предложение. и все понятно. ты уже хуеву тучу текста написал. и толку ноль!!! вот и вся разница между его и тобой. он действительно программист высокого уровня, он не только умеет программировать но и объяснять. а ты только пиздаболишь

skrudjmakdak 05.02.2014 14:58

Админы извините, но он меня вывел. Maxmaxmaximus7, ты блять далбаеб. я тебе 5ый раз говорю. объясни нормально. ты не понимаешь.

я не понял того момента, зачем передавать массив, когда обычно вызывая функцию передают набор аргументов. danik.js норм объяснил, я понял. что аргументы могут приходить в виде массива. он сказал одно предложение. и все понятно. ты уже хуеву тучу текста написал. и толку ноль!!! вот и вся разница между его и тобой. он действительно программист высокого уровня, он не только умеет программировать но и объяснять. а ты только пиздаболишь

Maxmaxmaximus7 05.02.2014 15:01

Цитата:

Сообщение от skrudjmakdak
я не понял того момента, зачем передавать массив, когда обычно вызывая функцию передают набор аргументов

так вот так и говори) лол, а ты поставил вопрос нафига 2 функции когда можно использовать одну.


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