| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > function |
| Автор: Се ля ви 15.8.2008, 12:05 | ||||||||||||
| Продолжаю экспериментировать с тонкостями JS в свободное время. На этот раз объектом исследования стало использование ключевого слова 'function'. Т.к. в JS всё является объектом, неудивительно, что и функция сама по себе является специфическим видом объекта тоже и с этих позиций более правильно и наглядно было, что бы не путаться и называть вещи своими именами, всегда писать вместо
вот так:
Однако это не очень наглядно и на самом деле, как будет показано ниже, не является одним и тем же. Специфика этого объекта довольно сильная. Так, например, операция typeof вообще не признает функцию объектом:
Тем не менее, это не примитив, ибо операция instanceof однозначно свидейтельствует, что это экземпляр, созданный конструктором Function:
Почему я поставил перед объявлением var? Проверим:
Т.е. внутренняя функция доступна только внутри closure, где расположена, как и переменные, объявленные с ключевым словом 'var' Так в чём же отличие? В том, что во втором случае мы не задействуем closure:
Так что в нашем распоряжении прекрасный метод борьбы с closure в случаях, когда оно нам не нужно. Правда, удобен для восприятия он только в случае небольших функций, ибо писать, а тем более сопровождать сложный код, разполагающийся внутри такой декларации представляется довольно затруднительным... |
| Автор: Zeroglif 15.8.2008, 17:10 | ||||
Теоретически парсится также, как и любое выражение (каждый раз или не каждый... э... построчно, в общем), также как и, например, var x = function () {};...
IE-юзвери пример не поймут. ;) |
| Автор: dsCode 15.8.2008, 18:59 | ||
Хм... Ну да, тут, смотря с какой стороны смотреть (а как в спецификации написано? - я что-то упустил это) - понятно, что все интерпретируется построчно при вызове. Ну а все же - есть разница? С одной стороны - уже готовый к вызову callable-объект (функция), с другой - строка - которую нужно сначала превратить в этот объект, а потом уже начинать выполнять построчно. Или... Что? Как только парсится первая строчка (в большой строке кода), - она сразу выполняется? а IE вообще function-expression не различает в этом отношении (в плане скопа)? =) Или все-таки есть случаи, когда IE соответствует спецификации в этом месте? - я посмотрел - любой из видов function-expression доступен для вызова за пределами объявления. |
| Автор: Се ля ви 19.8.2008, 12:10 | ||||||||||||||
Я это и имел в виду
А вот это интересно...
Ну тогда весь смысл теряется. Я же играюсь с инкапсуляцией
Ну да, то, что я называю private`ами. Об том и речь
Так любой private-объект, если его вернуть, будет доступен снаружи - кто бы сомневался. Просто возможность его скрыть и не зацепить при этом в closure то, что не нужно, представляет особый интерес
Ух ты! А вот это действительно интересная штука... Надо будет с ней покопаться, как время найду. Спасибо! |
| Автор: JSman 23.8.2008, 00:46 |
проблема с private была решена в base2, если не ошибаюсь. |
| Автор: S.A.P. 24.8.2008, 22:11 | ||
На основе этих рассуждений появилась бредовая идея как бороться со столько ненавистными нам замыканиями:
создаваемые функции не используют глобальный скоп и при этом не лезут в наше замыкание + лишены приведённого недостатка с написанием и сопровождением. Но всё равно както жутковато |
| Автор: JSman 17.9.2008, 00:40 |
| кстати, еще хотел бы просто дополнить в тему по поводу копирования и ссылок на функции. копирование функции (без всяких конвертирований) через оператор = можно сделать только при прямом присваивании функции к встроенному событию, например, onclick. в остальных случаях будет только ссылка. Причем копирование в этом случае будет только самого тела функции, без всяких расширений типа func.prop |