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. Ну а если мы передаём в ф-цию не массив аргументов, а просто массив как один аргумент? |
Часовой пояс GMT +3, время: 09:27. |