Javascript - разница между пространством имен и закрытием?

В чем разница между пространством имен и закрытием в Javascript? Мне они кажутся очень похожими.

ИЗМЕНИТЬ

В частности, в этой статье обсуждаются пространства имен и замыкания, а также есть предложения вроде

Теперь у нас все еще будут ситуации, когда мы захотим объявить переменные, которые естественным образом не вписываются в структуру объекта с пространством имен. Но мы не хотим, чтобы эти переменные имели глобальную область действия. Вот тут-то и пригодятся самозапускающиеся функции.

Далее он дает то, что очень похоже на закрытие, как «пространство имен объектов». Мне кажется, что пространство имен ЯВЛЯЕТСЯ закрытием ... но, может быть, это не так ...? Помощь?


person Ben    schedule 27.04.2012    source источник
comment
Разработайте свое определение пространства имен.   -  person J. Holmes    schedule 27.04.2012
comment
В Javascript нет пространств имен. Что вы имеете в виду под этим термином?   -  person Mark Reed    schedule 27.04.2012
comment
В javascript нет единого значения пространства имен, потому что есть много способов выполнить задачу разделения символов на пробелы (в том числе с помощью замыканий). Покажи код.   -  person Francis Avila    schedule 27.04.2012


Ответы (3)


Пространство имен - это, по сути, Object без каких-либо интересных свойств, в которые вы вставляете что-то, поэтому у вас нет кучи переменных с похожими и / или конфликтующими именами, бегающими по вашей области. Так, например, что-то вроде

MyNS = {}
MyNS.x = 2
MyNS.func = function() { return 7; }

Замыкание - это когда функция «сохраняет» значения переменных, которые в ней не определены, даже если эти переменные вышли за пределы области видимости. Возьмите следующее:

function makeCounter() { 
   var x = 0;
   return function() { return x++; }
}

Если я позволю c = makeCounter(), а затем повторно вызову c(), я получу 0, 1, 2, 3, .... Это связано с тем, что область внутренней анонимной функции, которую makeCounter определяет "закрывается" на x, поэтому она имеет ссылку на нее, даже если x находится вне области видимости.

В частности, если я затем сделаю d = makeCounter(), d() начнет отсчет с 0. Это потому, что c и d получают разные экземпляры x.

person Venge    schedule 27.04.2012
comment
Это действительно хороший ответ - спасибо! Хотя я подожду немного времени :) - person Ben; 27.04.2012
comment
+1 Я наконец понял замыкания (я пробовал 2-3 урока и всегда сдавался) - person ajax333221; 27.04.2012
comment
Да, это самое краткое и полезное объяснение закрытий, которое я видел - спасибо! Теперь я понимаю. - person iono; 11.08.2012
comment
Мне кажется, что это отличный ответ относительно замыканий, но я до сих пор не понимаю, почему они отличаются от пространств имен. Где вы получаете свое определение пространства имен, оно довольно конкретное, и мое впечатление от пространства имен - это просто именованный контекст, в котором никакие два объекта не могут иметь одно и то же имя. На мой взгляд, это означает, что замыкание - это тип пространства имен. - person snuggles; 05.04.2015

Пространство имен обычно представляет собой метод помещения всех ваших глобальных переменных в качестве свойств в одну главную глобальную переменную, таким образом добавляя только одну новую глобальную переменную действительно верхнего уровня. Это предотвращает загрязнение глобального пространства имен и снижает вероятность конфликта с другими глобальными переменными.

И пример пространства имен:

var YUI = {};
YUI.one = function(sel) {...};
YUI.two = function(sel) {...};
YUI.three = function(sel) {...};

Есть один новый элемент в глобальном пространстве имен верхнего уровня YUI, но есть несколько глобально доступных элементов через объект пространства имен YUI.

Замыкание - это функциональный блок, который длится дольше обычного завершения выполнения функции из-за постоянных ссылок на внутренние части функции.

function doSometing() {
    var x = 10;
    setTimer(function() {
        // this gets called after doSomething() has finished executing
        // but because of the function closure, the variables 
        // inside of the parent scope like x are still accessible
        x += 10;
    }, 1000);
}
person jfriend00    schedule 27.04.2012

Из http://jibbering.com/faq/notes/closures/:

Замыкание формируется путем возврата объекта функции, который был создан в контексте выполнения вызова функции из этого вызова функции, и присвоения ссылки на эту внутреннюю функцию свойству другого объекта. Или путем прямого присвоения ссылки на такой функциональный объект, например, глобальной переменной, свойству глобально доступного объекта или объекту, переданному по ссылке в качестве аргумента для внешнего вызова функции.

Пространства имен - это просто соглашение, объекты, созданные, чтобы не загромождать глобальную область видимости переменными.

person Geoffrey Hing    schedule 27.04.2012
comment
Добро пожаловать в SO, @GeoffreyHing! Спасибо за помощь, но мне кажется, что закрывающий абзац слишком сложен и чрезвычайно запутан ... но объяснение пространства имен ясное и краткое, +1. - person Ben; 27.04.2012