Практическое применние apply, call
|
Далеко не всегда имеет смысл добавлять функцию в объект, лишь для того чтобы применить ее к объекту:
function someFunc(/* переменное число аргументов */) { var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов } |
Также:
function someFunc(id) { // часто в js для увеличения производительности за счет // уменьшения процесса разрешения имен используются "псевдонимы" // здесь тоже может пригодиться применение функций var getId = document.getElementById, doc = document; var elem = getId.call(doc, id); /* * Здесь находятся большое количество вызовов * getId * */ } |
Цитата:
Появилось еще больше вопросов чем было.: 1. Почему нельзя взять просто arguments и применить к нему slice? Ну конечно навешать slice на объект arguments не выходит, но в Вашем коде как-то обрезает:-? То есть по идеи нужно преобразовать arguments в нормальный массив и получится тоже используя slice, или нет 2. Как slice делается массиву, ведь arguments это же не массив? То есть выходит если я правильно понял: вызвать функцию slice от объекта arguments, передав slice(1). От этого же arguments не станет массивом. 3. Часто в реальном JavaScript программировании применяются apply, call? Или это экзотика |
Цитата:
Цитата:
И вся серия. Цитата:
Туда же, если не читали ещё. |
Потому что реализация метода slice использует this в качестве ссылки на массив к которому применятся метод.
Slice удается применить к arguments потому что объект является массиво-подобным (хранит свойства под именами '1', '2', '3'; имеет свойство length). Этого достаточно. Смотря что вам нужно. Применяются для эмулирования полезных техник функционального программирования (каррирование к примеру). В стандарт ES5 добавлен метод bind для постоянного связывания с объектом. |
Kolyaj, SlavaPav спасибо!
Такой еще вопросик Два способа var args = Array.prototype.slice.call(arguments, 1); // получаем срез аргументов var args = [].slice.call(arguments, 1); они равнозначны, но не кроссбраузерны? Ниже ИЕ9 нужно использовать методы map или filter...? Вычитал по ссылкам выше. Эх лучше была бы экзотика не люблю такие извращения:) |
Цитата:
Цитата:
|
А такие способы применимы к любому объекту или это частный случай? так как этот объект, как было написано выше
Цитата:
Вроде все!:) |
Цитата:
|
Часовой пояс GMT +3, время: 18:27. |