Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Практическое применние apply, call (https://javascript.ru/forum/misc/18308-prakticheskoe-primennie-apply-call.html)

TicTac 25.06.2011 19:17

Практическое применние apply, call
 
Вот сижу и думаю зачем нужно использовать apply и call.
Вызывать функцию в контексте любого объекта, если же можно ее просто туда добавить в объект в виде метода и использовать.

Какое практическое применение их?

SlavaPav 25.06.2011 19:49

Далеко не всегда имеет смысл добавлять функцию в объект, лишь для того чтобы применить ее к объекту:
function someFunc(/* переменное число аргументов */) {
    var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов
}

SlavaPav 25.06.2011 19:58

Также:
function someFunc(id) {
    // часто в js для увеличения производительности за счет
    // уменьшения процесса разрешения имен используются "псевдонимы"
    // здесь тоже может пригодиться применение функций
    var getId = document.getElementById,
        doc = document;
    
    var elem = getId.call(doc, id);
    /*
     * Здесь находятся большое количество вызовов
     * getId
     *  
     */
}

TicTac 25.06.2011 21:01

Цитата:

Сообщение от SlavaPav (Сообщение 110459)
Далеко не всегда имеет смысл добавлять функцию в объект, лишь для того чтобы применить ее к объекту:
function someFunc(/* переменное число аргументов */) {
    var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов
}

Спасибо, работает понять бы еще как:)

Появилось еще больше вопросов чем было.:
1. Почему нельзя взять просто arguments и применить к нему slice?
Ну конечно навешать slice на объект arguments не выходит, но в Вашем коде как-то обрезает:-? То есть по идеи нужно преобразовать arguments в нормальный массив и получится тоже используя slice, или нет

2. Как slice делается массиву, ведь arguments это же не массив? То есть выходит если я правильно понял: вызвать функцию slice от объекта arguments, передав slice(1). От этого же arguments не станет массивом.

3. Часто в реальном JavaScript программировании применяются apply, call? Или это экзотика

Kolyaj 25.06.2011 21:14

Цитата:

Сообщение от TicTac
1. Почему нельзя взять просто arguments и применить к нему slice?

Так и делается. Берётся slice и применяется к arguments.

Цитата:

Сообщение от TicTac
2. Как slice делается массиву, ведь arguments это же не массив? То есть выходит если я правильно понял: вызвать функцию slice от объекта arguments, передав slice(1). От этого же arguments не станет массивом.

http://alljs.ru/articles/array/noarray#toarray
И вся серия.

Цитата:

Сообщение от TicTac
3. Часто в реальном JavaScript программировании применяются apply, call? Или это экзотика

Очень часто.


Туда же, если не читали ещё.

SlavaPav 25.06.2011 21:16

Потому что реализация метода slice использует this в качестве ссылки на массив к которому применятся метод.
Slice удается применить к arguments потому что объект является массиво-подобным (хранит свойства под именами '1', '2', '3'; имеет свойство length). Этого достаточно.
Смотря что вам нужно. Применяются для эмулирования полезных техник функционального программирования (каррирование к примеру). В стандарт ES5 добавлен метод bind для постоянного связывания с объектом.

TicTac 25.06.2011 21:37

Kolyaj, SlavaPav спасибо!

Такой еще вопросик

Два способа
var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов
var args = [].slice.call(arguments, 1);

они равнозначны, но не кроссбраузерны?
Ниже ИЕ9 нужно использовать методы map или filter...? Вычитал по ссылкам выше.

Эх лучше была бы экзотика не люблю такие извращения:)

Kolyaj 25.06.2011 21:40

Цитата:

Сообщение от TicTac
они равнозначны, но не кроссбраузерны?

Равнозначны и кроссбраузерны.

Цитата:

Сообщение от TicTac
Ниже ИЕ9 нужно использовать методы map или filter...?

В IE нет методов forEach/map/filter/reduce, но их можно добавить.

TicTac 25.06.2011 21:49

А такие способы применимы к любому объекту или это частный случай? так как этот объект, как было написано выше
Цитата:

Сообщение от SlavaPav (Сообщение 110473)
является массиво-подобным (хранит свойства под именами '1', '2', '3'; имеет свойство length).


Вроде все!:)

monolithed 25.06.2011 22:26

Цитата:

Сообщение от TicTac
А такие способы применимы к любому объекту или это частный случай

зависит от вашей фантазии...


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