Помогите плиз разобраться с неймспейсами/замыканиями
Приветы!
Читаю JavascriptGarden статью , подзастрял в понимании раздела "Пространства имён". Предназначение пространства имен мне понятно (избежание конфликтов имён). Вопросы больше тому, как это работает. Поехали... :write: Цитата: "Нередко можно столкнуться с неприятным последствием от наличия одного единственного глобального пространства имён — проблемы с перекрытием имён переменных. В JavaScript эту проблему легко избежать, используя анонимные обёртки." (function() { // самодостаточное «пространство имён» window.foo = function() { // открытое замыкание }; })(); // сразу же выполнить функцию 1. Что дает приведенный пример по сравнению с таким кодом: var func = function() { // самодостаточное «пространство имён» window.foo = function() { // открытое замыкание }; } func(); или таким: window.foo = function() { // открытое замыкание }; 2. Что имеет в виду автор под "ОТКРЫТОЕ замыкание"? Надо полагать, что бывают и закрытые замыкания. В чем между ними разница в реализации и использовании? Возможно, я придираюсь к словам, но этот термин попался мне впервые и сильнее всё запутал. Еще цитата: "Безымянные функции являются отложенными выражениями (прим. перев. — то есть, они не разбираются по месту описания, а откладываются парсером напоследок); поэтому, чтобы вы сделать их исполняемыми, следует спровоцировать их разбор." На сколько я понимаю, функция сохраняет ссылку на вышестоящий скоуп в момент объявления функции (тут можно спутать со скоупом вызывающей функции). Т.е. js-парсер исполняет текущую функцию, до ходит до объявления внутренней функции одним из таких способов // работаем в контексте функции parent() ... var a = 1; var f1 = function() { console.log(a); } // анонимная функция function f2() { console.log(a); } // именованная функция var obj={ a: 555, f3: function() { console.log(a); } // анонимная функция внутри объекта, // но "а" ссылается на скоуп внешней функции, а не текущего объекта } По мере нахождения определения функций f*(), парсер создает объекты функций и устанавливает им ссылку на контекст функции foo. Потом этот контекст будет использован для поиска переменных, которые не удалось обнаружить внутри функций f*() (опять же вопреки ложному ощущению, что не найденные внутри f*() переменный будут искаться в контексте вызывающей функции) Я привел свои размышления о том, как работает приведенный кусок кода, чтобы легче было указать, что я до конца не понимаю. 3. Я не понимаю выше приведенную фразу про анонимные функции и отложенные выражения. В чем отличие анонимных (безымянных) функций от именованных в плане "разбора функции" (вот этот термин тоже неясен, что значит "разбор функции" :-? ). 4. Значит ли это, что анонимные функции сохраняют ссылку на скоуп не той функции, в которой они объявлены, а какой-то другой функции? какой? 5. Возможно это повтор 4-го вопроса, но непонятна фраза "откладываются парсером напоследок" - напоследок, это до какого момента? Какие это несет особенности по сравнению с именованными функциями? Благодарю тех, кто прочитал этот длинный монолог :), и заранее благодарю за ответы. |
Цитата:
(function() { var privateVariable = 1; window.foo = function() { typeof privateVariable //→ "number" }; })(); typeof privateVariable //→ "undefined"Такое замыкание используется, чтобы изолировать приватные переменные и функции. Подробнее про замыкания здесь: http://dmitrysoshnikov.com/ecmascrip...er-6-closures/ Цитата:
Цитата:
Function declaration function funcName() {} Function expression var func = function () {} //или (function () {}) //или {method: function () {}} //или любое другое выражение, где создается функция Named function expression var func = function funcName() {}; //или (function funcName() {}) //или {method: function funcName() {}} //или любое другое выражение, где создается именованная функция Function declaration создается сразу при входе в контекст, независимо от того, где в коде она располагается (function () { typeof funcName //→ "function"; function funcName() {} }());остальные создаются по мере исполнения (function () { typeof func //→ "undefined"; var func = function () {} }()); Подробнее здесь: http://dmitrysoshnikov.com/ecmascrip...r-5-functions/ После прочтения статей, остальные вопросы должны отпасть. Ну и вообще это основы языка, рекомендую все статьи с того сайта прочесть: http://dmitrysoshnikov.com/ecmascrip...tion-contexts/ http://dmitrysoshnikov.com/ecmascrip...riable-object/ http://dmitrysoshnikov.com/ecmascrip...hapter-3-this/ http://dmitrysoshnikov.com/ecmascrip...4-scope-chain/ http://dmitrysoshnikov.com/ecmascrip...r-5-functions/ http://dmitrysoshnikov.com/ecmascrip...er-6-closures/ http://dmitrysoshnikov.com/ecmascrip...eneral-theory/ http://dmitrysoshnikov.com/ecmascrip...mplementation/ http://dmitrysoshnikov.com/ecmascrip...tion-strategy/ ну или читайте учебник на этом сайте http://learn.javascript.ru/ |
Часовой пояс GMT +3, время: 01:04. |