05.02.2014, 11:41
|
Профессор
|
|
Регистрация: 27.04.2012
Сообщений: 1,410
|
|
apply and call in function
Вопрос конечно смешной, дабы я уже довольно таки долго занимаюсь js, но все же...
меня мучает один вопрос. методы apply и call. единственное различие, которое я нашел это как идет передача параметров, обычное перечисление или массив.. неужели надо было создавать два метода, когда в принципе можно обойтись одним?? или есть еще какие то нюансы о которых я не знаю?
|
|
05.02.2014, 11:57
|
Профессор
|
|
Регистрация: 08.01.2014
Сообщений: 354
|
|
skrudjmakdak
apply передает массив аргументов
call передает аргументы по отдельности.
ты говоришь что обе эти штуки может делать какой-то один из этих методов.
приведи пример когда какой-то один из этих методов делает обе эти штуки.
Сообщение от skrudjmakdak
|
дабы я уже довольно таки долго занимаюсь js
|
а вот в этом я сомневаюсь
Последний раз редактировалось Maxmaxmaximus7, 05.02.2014 в 12:02.
|
|
05.02.2014, 12:21
|
Профессор
|
|
Регистрация: 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>
и объясните НОРМАЛЬНО, если можно с примерами, чем они различаются. т.к. я большой разницы пока не вижу....
|
|
05.02.2014, 12:40
|
|
Быдлокодер;)
|
|
Регистрация: 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, 05.02.2014 в 12:59.
|
|
05.02.2014, 12:57
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Сообщение от skrudjmakdak
|
[3, 5, 7]
|
У тебя в примере заранее известны все аргументы. В реале же число аргументов может быть разным и приходить ввиде массива. Как ты в таком случае обойдешься без apply?
Сообщение от kobezzza
|
apply - это просто сахар для call.
|
Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply (пожертвовав удобством и скоростью (потери на создании массива)).
__________________
В личку только с интересными предложениями
Последний раз редактировалось danik.js, 05.02.2014 в 12:59.
|
|
05.02.2014, 12:58
|
|
Быдлокодер;)
|
|
Регистрация: 19.11.2010
Сообщений: 4,338
|
|
Сообщение от danik.js
|
Скорее наоборот. Функция apply не заменима. А вот call можно заменить через apply.
|
Да, ты прав.
Кстати в ECMAScript6 можно будет делать так:
fn(...[1, 2, 3]);
Последний раз редактировалось kobezzza, 05.02.2014 в 13:01.
|
|
05.02.2014, 13:22
|
Профессор
|
|
Регистрация: 08.01.2014
Сообщений: 354
|
|
Сообщение от skrudjmakdak
|
держи его при себе
|
с чего это мне держать свое мнение при себе? ты выставил на публику информацию о том давно ты там или не давно ты там занимаешься чем-то. тебя ни кто за язык не тянул. ты выложел информацию - люди обсуждают эту информацию. не хотел публичности не выкладывай на всеобщее обсуждение. вопросы?
Последний раз редактировалось Maxmaxmaximus7, 05.02.2014 в 13:24.
|
|
05.02.2014, 13:22
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
Сообщение от skrudjmakdak
|
Уважаемый Maxmaxmaximus7
|
так будет правильней
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
05.02.2014, 13:26
|
Профессор
|
|
Регистрация: 08.01.2014
Сообщений: 354
|
|
skrudjmakdak, ты сказал что обе вещи для которых предназначены эти функции можно сделать одной из этих функций, продемонстрируй это.
|
|
05.02.2014, 13:44
|
|
Профессор
|
|
Регистрация: 30.04.2012
Сообщений: 3,018
|
|
Оба метода очень нужны.
Например, если мне нужно передать только одну переменную, то я воспользуюсь call'ом, а вот если несколько, то можно тоже call'ом, но иногда бывает (как сказал danik.js) количество передаваемых аргументов не известно, поэтому просто передаём массив через apply.
А сделать в одну не получится, так как например: Вы хотите, чтобы метод понимал, если ему передаётся массив, то используем как apply, а если нет, то - call. Ну а если мы передаём в ф-цию не массив аргументов, а просто массив как один аргумент?
Последний раз редактировалось ruslan_mart, 05.02.2014 в 13:47.
|
|
|
|