| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > JavaScript: Общие вопросы > Конструкция (function() {...})(); |
| Автор: Royan 23.9.2007, 18:50 | ||
Вот наткнулся примерно на такой код
Объясните пожалуйста, что он делает, и когда его удобно использовать? |
| Автор: dsCode 23.9.2007, 19:43 |
| Royan, это анонимная функция. Вызывается сразу. Если после объявления foo написать foo()(); - выведет алерт "string". В основном используется для имитации синглтона (что-то вроде, наподобие). Функцию можно вызвать один раз. |
| Автор: Zeroglif 23.9.2007, 19:56 | ||||||||
Expression Statement не может начинаться с левой фигурной или с ключевого слова function. Так нельзя:
Нужно изменить Statement, не меняя смысла и результата, для этого наиболее удобным оператором является Grouping Operator (скобки вокруг выражения):
Говоря по-простому - это безымянная функция (FunctionExpression), которая тут же на месте и вызывается. Обычно такую схему применяют для инкапсуляции сокрытия идентификаторов от внешнего контекста, как правило, глобального, в процессе какой-то разовой работы (букмарклеты так запускают или либы инициализируют). В теле функции объявляются переменные и(или) функции, которые недоступны извне и затеняют одноимённые идентификаторы во внешнем(их) контексте(ах):
В вашем случае объявлена переменная foo, значением которой стала ещё одна безымянная функция. Тело этой функции роли не играет, т.к. функция дальше не вызывается, но если бы она была вызвана, допустим, через foo(), то она бы вернула ещё одну безымянную функцию (замыкание):
Больше в коде ничего интересного нет. |
| Автор: Royan 23.9.2007, 22:22 |
| Zeroglif, dsCode, понял спасибо! |
| Автор: lemax 14.10.2007, 16:14 | ||
| продолжите, пожалуйста объяснение для такого скрипта. Этот скрипт вызывается из С++ ScriptExecute("здесь скрипт", "JScript" ); Сам скрипт:
Особенно непонятный для меня набор крючков по середине. |
| Автор: Zeroglif 14.10.2007, 17:28 | ||
На крючки можно не смотреть, в функцию отправляется ряд плохочитаемых аргументов, функция раскручивает их в более осмысленную строку p, строка p eval-ится в код:
Дальше смотрите этот код сами, разбирайтесь, что происходит... |
| Автор: lemax 14.10.2007, 17:44 |
| Супер, спасибо. |
| Автор: Royan 16.11.2007, 16:20 |
| Любопытный пример обфускации кода, не встречал такого ранее, но бестолковый по сути, ибо во-первых тут не изменены смысловые имена переменных, а во вторых даже если бы они были изменены, то разница между этим и стандартным способом в пользу стандартного, потому что здесь код компилируется функцией eval, да еще и непосредственно в момент выполнения операции. |
| Автор: cruelangel 16.11.2007, 21:49 | ||
|