Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.06.2011, 19:17
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

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

Какое практическое применение их?
Ответить с цитированием
  #2 (permalink)  
Старый 25.06.2011, 19:49
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Далеко не всегда имеет смысл добавлять функцию в объект, лишь для того чтобы применить ее к объекту:
function someFunc(/* переменное число аргументов */) {
    var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов
}
Ответить с цитированием
  #3 (permalink)  
Старый 25.06.2011, 19:58
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Также:
function someFunc(id) {
    // часто в js для увеличения производительности за счет
    // уменьшения процесса разрешения имен используются "псевдонимы"
    // здесь тоже может пригодиться применение функций
    var getId = document.getElementById,
        doc = document;
    
    var elem = getId.call(doc, id);
    /*
     * Здесь находятся большое количество вызовов
     * getId
     *  
     */
}
Ответить с цитированием
  #4 (permalink)  
Старый 25.06.2011, 21:01
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Сообщение от SlavaPav Посмотреть сообщение
Далеко не всегда имеет смысл добавлять функцию в объект, лишь для того чтобы применить ее к объекту:
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? Или это экзотика

Последний раз редактировалось TicTac, 25.06.2011 в 21:03.
Ответить с цитированием
  #5 (permalink)  
Старый 25.06.2011, 21:14
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от 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? Или это экзотика
Очень часто.


Туда же, если не читали ещё.
Ответить с цитированием
  #6 (permalink)  
Старый 25.06.2011, 21:16
Аватар для SlavaPav
Аспирант
Отправить личное сообщение для SlavaPav Посмотреть профиль Найти все сообщения от SlavaPav
 
Регистрация: 25.02.2010
Сообщений: 57

Потому что реализация метода slice использует this в качестве ссылки на массив к которому применятся метод.
Slice удается применить к arguments потому что объект является массиво-подобным (хранит свойства под именами '1', '2', '3'; имеет свойство length). Этого достаточно.
Смотря что вам нужно. Применяются для эмулирования полезных техник функционального программирования (каррирование к примеру). В стандарт ES5 добавлен метод bind для постоянного связывания с объектом.
Ответить с цитированием
  #7 (permalink)  
Старый 25.06.2011, 21:37
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

Kolyaj, SlavaPav спасибо!

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

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

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

Эх лучше была бы экзотика не люблю такие извращения
Ответить с цитированием
  #8 (permalink)  
Старый 25.06.2011, 21:40
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

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

Сообщение от TicTac
Ниже ИЕ9 нужно использовать методы map или filter...?
В IE нет методов forEach/map/filter/reduce, но их можно добавить.
Ответить с цитированием
  #9 (permalink)  
Старый 25.06.2011, 21:49
Кандидат Javascript-наук
Отправить личное сообщение для TicTac Посмотреть профиль Найти все сообщения от TicTac
 
Регистрация: 07.09.2010
Сообщений: 133

А такие способы применимы к любому объекту или это частный случай? так как этот объект, как было написано выше
Сообщение от SlavaPav Посмотреть сообщение
является массиво-подобным (хранит свойства под именами '1', '2', '3'; имеет свойство length).

Вроде все!
Ответить с цитированием
  #10 (permalink)  
Старый 25.06.2011, 22:26
Особый гость
Посмотреть профиль Найти все сообщения от monolithed
 
Регистрация: 02.04.2010
Сообщений: 4,260

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

Последний раз редактировалось monolithed, 25.06.2011 в 22:37.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
apply и call. В чём отличия? B~Vladi Оффтопик 49 24.09.2009 10:35