powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Передача разнотипных аргументов в call, apply.
22 сообщений из 22, страница 1 из 1
Передача разнотипных аргументов в call, apply.
    #38351836
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишут в учебнике, что в call остальными аргументами кроме первого можно передавать только переменные, а в aplly - только массив.

Что мешает в call второй переменной передать массив? В чем тогда нужность метода aplly?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38351857
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerЧто мешает в call второй переменной передать массив?ничего не мешает. Но эффект будет не такой же, как при передаче массива в apply
lanzerВ чем тогда нужность метода aplly?для случая, если фактические параметры упакованы в массив.

В общем и целом - apply более универсален, т.к. параметры всегда можно собрать в массив и вместо call(th, a, b, c) написать apply(th, [a, b, c]) , а вот наоборот - никак.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38351858
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
допустим, я написал функцию "по регистрации коллекции каких-то значений допустим асинхронно в БД"
на вход ей требуется массив этих самых регистрируемых значений
---------------------------------------------------------------------------------------------------------

потом Вы захотели воспользоваться ею в своих целях, но задавая какой-то свой this

покажите, как Вы будете вызывать ее посредством call
и как-посредством apply
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38351926
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный МечlanzerЧто мешает в call второй переменной передать массив?ничего не мешает. Но эффект будет не такой же, как при передаче массива в apply
lanzerВ чем тогда нужность метода aplly?для случая, если фактические параметры упакованы в массив.

Так и не понял почему эффект не будет таким же. Это ведь тот же массив. Допустим:

Код: javascript
1.
2.
3.
a = [];
my_function.call(o, a);
my_function.apply(o, a);



Паганель потом Вы захотели воспользоваться ею в своих целях, но задавая какой-то свой this

Насчет this тоже неясно, вот для себя нашел короткий пример , казалось бы math.min уже написан c использованием this и в этом дело. Но если на практике я бы писал свой math.min, что бы мешало передавать туда просто объект без call или apply, и обращать к нему по такому имени внутри функции, допустим как по math_object, а не по this.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38351933
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerТак и не понял почему эффект не будет таким же. Это ведь тот же массив. Допустим:

Код: javascript
1.
2.
3.
a = [];
my_function.call(o, a);
my_function.apply(o, a);

если на одном только прочтении учебника этот момент не усваивается, советую глянуть под дебагом, а потом перечитать главу про call и apply ещё раз.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38351964
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerТак и не понял почему эффект не будет таким же. Это ведь тот же массив. Допустим:

Код: javascript
1.
2.
3.
a = [];
my_function.call(o, a);
my_function.apply(o, a);





разница в удобстве...
например в Вашем примере первый вызов выполнит myfunction([]), а второй myfunction()
то есть, представим у нас есть функция
Код: javascript
1.
2.
3.
4.
5.
6.
7.
function myfunc(name, value, var1, var2, var3, var4){
 this.name = name;
 this.value = someFunc(value);
 this.altValue = var1;
 this.class = var2+" "+var3;
 ....
}



Итак, имея массив значений, вызывая данную функцию в другом контексте мы можем написать:
Код: javascript
1.
myfunc.call(obj, arr.name, arr.value, arr.var1, arr.var2, arr.var3, arr.var4);


или просто
Код: javascript
1.
myfunc.apply(obj, arr);


второй явно удобнее :)

Или например если одна функция вызывается из другой, и первой ничего неизвестно об аргументах второй (такая себе функция обёртка)... через call Вы не сможете вызвать нормально внутреннюю функцию, так как Вам надо будет во внешней функции явно знать требующиеся аргументы первой и их количество. А вот так будет всё ок:
Код: javascript
1.
2.
3.
4.
5.
function outerFunct(obj){
...
  innerFunc.apply(obj, arguments.slice[1])
...
}



Вот так.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352042
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрразница в удобстве...

Итак, имея массив значений, вызывая данную функцию в другом контексте мы можем написать:
Код: javascript
1.
myfunc.call(obj, arr.name, arr.value, arr.var1, arr.var2, arr.var3, arr.var4);


или просто
Код: javascript
1.
myfunc.apply(obj, arr);


второй явно удобнее :)


Удобнее, конечно, но что мешает и в call также вызывать:
Код: javascript
1.
myfunc.call(obj, arr);



В учебнике пишут.
авторПервый аргумент методов call() и apply() – это объект, для
которого выполняется функция; этот аргумент становится значением ключевого
слова this в теле функции. Все оставшиеся аргументы call() – это значения, пере
даваемые вызываемой функции.

Все оставшиеся аргументы call - это значения пере
даваемые вызываемой функции. Значением может быть и массив?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352063
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerчто мешает и в call также вызывать:
Код: javascript
1.
myfunc.call(obj, arr);

ну я же говорю, допустим моя функция просит на вход один аргумент, являющийся массивом, например
Код: javascript
1.
2.
3.
function myFunction(arr) {
    alert(arr.length);
}

"обычное" ее использование я, как автор, предполагал примерно таким:
Код: javascript
1.
2.
var arr = [3, 2];
myFunction(arr);



как Вы будете вызывать ее посредством call
и как-посредством apply
?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352081
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzer
Удобнее, конечно, но что мешает и в call также вызывать:
Код: javascript
1.
myfunc.call(obj, arr);




Представьте, что Вы используете библиотеку (фреймворк), которую писали не Вы (предшественник по работе, или например просто какая-то знаменитая типа jQuery). И в этой библиотеке есть функция:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
function inputValidator(type, format = null){
 var data = this.value;
 switch(type){
  case 'date': ... //проверка даты, true - если дата соответствует формату, false - если нет
  ... //другие валидаторы
  default: return false;
 }
}


А теперь попробуйте выполнить:
Код: javascript
1.
inputValidator.call(myInput, ['date', 'Y-m-d H:i:s']);


Как думаете, что вернёт функция, независимо от верности введённой даты? А вернёт false, потому как type никогда не будет соответствовать строке 'date'. Вот в этом то и разница передачи массива в apply и в call.

Но, если Вы и сейчас не можете понять почему - надо забить в гугле "разница между call и apply" и открывая все ссылки по очереди читать до наступления просветления. Можно ещё в примерах использования покопаться. Если просветление не придёт - читайте статьи более общего содержания про js (видимо Вы ещё не улавливаете в принципе смысл происходящего)... ну и т.д.

P.S. Только не верьте разным надписям, где говорится что javascript - красивый и изящный язык.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352098
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerТак и не понял почему эффект не будет таким же. Это ведь тот же массив. Допустим:

Код: javascript
1.
2.
3.
a = [];
my_function.call(o, a);
my_function.apply(o, a);

в первом случае функции будет передан 1 аргумент (пустой массив), во втором - ни одного аргумента.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352173
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пишут в ЕСMA по apply , что если в apply передать не объект, то сгенерируется исключение TypeError. Обязательный тип аргументов метода call не приводиться .

Паганельlanzerчто мешает и в call также вызывать:
Код: javascript
1.
myfunc.call(obj, arr);

ну я же говорю, допустим моя функция просит на вход один аргумент, являющийся массивом, например
Код: javascript
1.
2.
3.
function myFunction(arr) {
    alert(arr.length);
}

"обычное" ее использование я, как автор, предполагал примерно таким:
Код: javascript
1.
2.
var arr = [3, 2];
myFunction(arr);



как Вы будете вызывать ее посредством call
и как-посредством apply
?

Именно поэтому получается, что только при помощи apply можно в Вашем примере передавать массив.

lanzerПишут в учебнике, что в call остальными аргументами кроме первого можно передавать только переменные, а в aplly - только массив.

Что мешает в call второй переменной передать массив? В чем тогда нужность метода aplly?


Вопрос приобрел новую форму(впринципе в этом больше всего и была его суть с самого начала). Зачем потребовалось делать два разных метода, что мешало сделать один универсальный, чтобы туда можно было что-угодно передавать: массивы, объекты, аргументы?

Разница в названиях call и apply при одной и той же главной сути(передача объекта для использования его как this) также приводят в смятение, почему не call_via_args и call_via_object. Т.е. я по кр. мере не вижу какого-то еще одного главного различия.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352182
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerЗачем потребовалось делать два разных метода, что мешало сделать один универсальный, чтобы туда можно было что-угодно передавать: массивы, объекты, аргументы?я тебе сразу написал, что apply универсален, его можно юзать вместо call
14649444

call сделан только для удобства, чтобы параметры не приходилось оборачивать в массив, если они доступны по отдельности.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352187
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerтолько при помощи apply можно в Вашем примере передавать массивВы бы хоть попробовали что ли
http://jsfiddle.net/f3WMW/
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352228
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганельlanzerтолько при помощи apply можно в Вашем примере передавать массивВы бы хоть попробовали что ли
http://jsfiddle.net/f3WMW/

Ну да, тип аргументов не указан, значит они могут быть любыми, в том числе объектом. Пардон, совсем упустил из вида.

Яростный мечя тебе сразу написал, что apply универсален, его можно юзать вместо call
14649444

Как раз наоборот получается. Вот пример, где при помощи call передается и переменная и массив.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
my_arr = [];
my_arr[0] = 1;
my_arr[1] = 2;
	
function my_func(a, b){
	alert(a);
	alert(b);
}
	
my_func.call(my_obj, 1, my_arr);



И зачем тогда нужен apply?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352238
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerПаганельпропущено...
Вы бы хоть попробовали что ли
http://jsfiddle.net/f3WMW/

Ну да, тип аргументов не указан, значит они могут быть любыми, в том числе объектом. Пардон, совсем упустил из вида.

Яростный мечя тебе сразу написал, что apply универсален, его можно юзать вместо call
14649444

Как раз наоборот получается. Вот пример, где при помощи call передается и переменная и массив.

Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
my_arr = [];
my_arr[0] = 1;
my_arr[1] = 2;
	
function my_func(a, b){
	alert(a);
	alert(b);
}
	
my_func.call(my_obj, 1, my_arr);



И зачем тогда нужен apply?

просветление не пришло...
Вы понимаете разницу между "в функцию можно передавать только массив" и "параметры функции передаются через массив"... Так вот, Вы пишите словно к apply относится первая фраза... А реально к apply относится именно вторая фраза. В функцию параметры передаются через массив (то есть подаёте массив, он разбирается и в функцию приходят параметры).

Ну это нереально. Вы троллите просто, или реально не понимаете о чём мы все тут говорим?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352241
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lanzerИ зачем тогда нужен apply?хорошо, другой пример:
у тебя есть функция func, которая принимает некоторое число параметров.
значения этих параметров лежат в массиве arr
как вызвать func для этих значений?
стандартное решение - func.apply(obj, arr)
а теперь попробуй без apply
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352254
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все примеры высосаны из пальца, apply придумали чтобы нарезать и закидывать в неё коллекцию arguments у текущего контекста вызова, а так же дергать функции с вариативным числом аргументов.
И вообще, не читайте за обедом советских газет (с), читайте англоязычную прессу, там лучше разжевывают: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352388
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зывсе примеры высосаны из пальцада ну? Вы никогда не встречали чужую функцию, которая на вход хочет массив?
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352901
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Паганельда ну? Вы никогда не встречали чужую функцию, которая на вход хочет массив?
не знаю как это относится к вопросу автора, который спрашивал, нафига нужен apply, если есть call
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352911
Фотография Паганель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для того, чтобы это узнать, попробуйте сами ответить на мой вопрос , ато автор так и не ответил
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38352941
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПаганельДля того, чтобы это узнать, попробуйте сами ответить на мой вопрос , ато автор так и не ответил

Код: javascript
1.
2.
3.
4.
5.
6.
function myFunction(arr) {
    alert(arr.length);
}
var arr = [3, 2];
myFunction.apply(null, [arr]);
myFunction.call(null, arr);



Да вот только не один уже пример подобного рода приводили. Автор не может осознать разницу между двумя записями.
...
Рейтинг: 0 / 0
Передача разнотипных аргументов в call, apply.
    #38353026
lanzer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Теперь понял. Не троллю, просто неправильно понимал этот абзац из учебника:

авторМетод apply() похож на метод call(), за исключением того, что передаваемые
функции аргументы задаются в виде массива:

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

Всем выражаю большую благодарность за терпение к моему вопросу.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / HTML, JavaScript, VBScript, CSS [игнор отключен] [закрыт для гостей] / Передача разнотипных аргументов в call, apply.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]