Приветы!
Читаю
JavascriptGarden статью , подзастрял в понимании раздела "Пространства имён". Предназначение пространства имен мне понятно (избежание конфликтов имён). Вопросы больше тому, как это работает. Поехали...
Цитата:
"Нередко можно столкнуться с неприятным последствием от наличия одного единственного глобального пространства имён — проблемы с перекрытием имён переменных. В 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-го вопроса, но непонятна фраза "откладываются парсером напоследок" - напоследок, это до какого момента? Какие это несет особенности по сравнению с именованными функциями?
Благодарю тех, кто прочитал этот длинный монолог
, и заранее благодарю за ответы.