Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.04.2014, 13:37
Новичок на форуме
Отправить личное сообщение для sneggg Посмотреть профиль Найти все сообщения от sneggg
 
Регистрация: 05.04.2014
Сообщений: 1

Помогите плиз разобраться с неймспейсами/замыканиями
Приветы!

Читаю 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-го вопроса, но непонятна фраза "откладываются парсером напоследок" - напоследок, это до какого момента? Какие это несет особенности по сравнению с именованными функциями?

Благодарю тех, кто прочитал этот длинный монолог , и заранее благодарю за ответы.
Ответить с цитированием
  #2 (permalink)  
Старый 05.04.2014, 14:21
Отправить личное сообщение для Octane Посмотреть профиль Найти все сообщения от Octane  
Регистрация: 10.07.2008
Сообщений: 3,873

Сообщение от sneggg
Что дает приведенный пример
(function() {
 
	var privateVariable = 1;

	window.foo = function() {
		typeof privateVariable //→ "number"
	};

})();

typeof privateVariable //→ "undefined"
Такое замыкание используется, чтобы изолировать приватные переменные и функции.
Подробнее про замыкания здесь: http://dmitrysoshnikov.com/ecmascrip...er-6-closures/


Сообщение от sneggg
Что имеет в виду автор под "ОТКРЫТОЕ замыкание"? Надо полагать, что бывают и закрытые замыкания
Нет такого понятия

Сообщение от sneggg
Безымянные функции являются отложенными выражениями
Различают 3 вида создания функций:
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/

Последний раз редактировалось Octane, 05.04.2014 в 14:24.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться ... Я новенький в JS ... bogong Общие вопросы Javascript 23 27.12.2011 19:20
Помогите разобраться с кодом. TheWanderer Общие вопросы Javascript 10 17.04.2010 13:41
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24