apply and call in function
Вопрос конечно смешной, дабы я уже довольно таки долго занимаюсь js, но все же...
меня мучает один вопрос. методы apply и call. единственное различие, которое я нашел это как идет передача параметров, обычное перечисление или массив.. неужели надо было создавать два метода, когда в принципе можно обойтись одним?? или есть еще какие то нюансы о которых я не знаю? :) |
skrudjmakdak
apply передает массив аргументов call передает аргументы по отдельности. ты говоришь что обе эти штуки может делать какой-то один из этих методов. приведи пример когда какой-то один из этих методов делает обе эти штуки. Цитата:
|
Уважаемый 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> и объясните НОРМАЛЬНО, если можно с примерами, чем они различаются. т.к. я большой разницы пока не вижу.... |
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 и т.д.); } |
Цитата:
Цитата:
|
Цитата:
Кстати в ECMAScript6 можно будет делать так: fn(...[1, 2, 3]); |
Цитата:
|
Цитата:
|
skrudjmakdak, ты сказал что обе вещи для которых предназначены эти функции можно сделать одной из этих функций, продемонстрируй это.
|
Оба метода очень нужны.
Например, если мне нужно передать только одну переменную, то я воспользуюсь call'ом, а вот если несколько, то можно тоже call'ом, но иногда бывает (как сказал danik.js) количество передаваемых аргументов не известно, поэтому просто передаём массив через apply. А сделать в одну не получится, так как например: Вы хотите, чтобы метод понимал, если ему передаётся массив, то используем как apply, а если нет, то - call. Ну а если мы передаём в ф-цию не массив аргументов, а просто массив как один аргумент? |
Ruslan_xDD, суть не в том что не надо передавать массив, он сказал что оба способа передачи аргументов можно реализовать одной из этих функций, я хочу чтобы он проделал это. а он видимо не может.
типа .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'ом на три символа меньше, да и работает он вроде быстрее, если не ошибаюсь. |
Цитата:
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% что это не критическое место в вашем приложении и оптимизация этого места не будет даже заметна. |
Отвечаю Maxmaxmaximus7, дабы он яркая персона...
Цитата:
Я сказал, что занимаюсь давно, но есть пробел в этой теме и хочу его заполнить. И это не означает что я полный нуб. усек? Я последнее. я не хочу выяснять отношения. мне нужен всего лишь ответ на вопрос. учись как отвечают danik.js и kobezzza, нормально и без публичных обсужений. Отвечаю kobezzza Цитата:
Отвечаю danik.js Цитата:
т.е. получается, если известен список передаваемых аргументов (например как у меня), то впринципе можно использовать и то и то.. но лучше call. а если список аргументов идет изначально массивом, то лучше использовать apply, дабы не разбарать массив на простые составляюшие. правильно понял? |
skrudjmakdak, такое ощущение, что ты не читал всё что здесь написали. Если ты не понимаешь в чём разница и где что применять, то ты правда ещё совсем зелёный (обижаться на это глупо).
|
пока писал дофига мне написали..
|
Цитата:
Цитата:
|
блять одна функция принимает массив параметров, другая просто параметры, он блять говорит зачем вторая так как можно параметры запихать в массив и передать в первую, ну не наркоман ли?
ухожу с темы, ты правда зеленый еще, еще и обижается, давно он программирует, как же если кто хочет с ним возитьяс возитесь, я сделал все что смог. |
Maxmaxmaximus7, вот представь себе, занимаюсь давно. а вот эту тему упустил. одно время я ими вообще не оперировал, даже не знал о их существовании. этой темы вообще небыло в том учебнике, по которому я учился. оперировать стал недавно, прочитав случайно на этом сайте. звучит странно, очень странно, но это действительно так
|
Делаю последнюю попытку объяснить и тоже сливаюсь:
У тебя есть массив, в нём хз сколько элементов, задача найти максимальный элемент. Вспоминаешь про Math.max: // Пример Math.max(1, 2, 3, 4, 5); Вспоминаешь про .apply var myArray = [хз сколько элементов]; // Урра всё работает! Math.max.apply(null, myArray); После этого примера (при условии, что ты его понял) внезапно обнаруживаешь, что таких случаев очень много и самый частый из них это написание фасадов (см. пример что я давал выше). Всё, я удаляюсь. |
skrudjmakdak, ну, а зачем ты сказал что занимаешься давно если не хотел обсуждать это?
Цитата:
|
Цитата:
|
Админы извините, но он меня вывел. Maxmaxmaximus7, ты блять далбаеб. я тебе 5ый раз говорю. объясни нормально. ты не понимаешь.
я не понял того момента, зачем передавать массив, когда обычно вызывая функцию передают набор аргументов. danik.js норм объяснил, я понял. что аргументы могут приходить в виде массива. он сказал одно предложение. и все понятно. ты уже хуеву тучу текста написал. и толку ноль!!! вот и вся разница между его и тобой. он действительно программист высокого уровня, он не только умеет программировать но и объяснять. а ты только пиздаболишь |
Админы извините, но он меня вывел. Maxmaxmaximus7, ты блять далбаеб. я тебе 5ый раз говорю. объясни нормально. ты не понимаешь.
я не понял того момента, зачем передавать массив, когда обычно вызывая функцию передают набор аргументов. danik.js норм объяснил, я понял. что аргументы могут приходить в виде массива. он сказал одно предложение. и все понятно. ты уже хуеву тучу текста написал. и толку ноль!!! вот и вся разница между его и тобой. он действительно программист высокого уровня, он не только умеет программировать но и объяснять. а ты только пиздаболишь |
Цитата:
|
Часовой пояс GMT +3, время: 05:44. |