EDITJavascript закрытия - в чем разница между этими
С количеством ответов, говоря «вы можете сделать личные вещи!» ниже, я также добавлю это в верхнюю часть:
Я знаю, что вы можете эмулировать частные переменные в закрытии. Это не то, о чем я прошу. Я спрашиваю, учитывая два примера ниже, где я «экспортирую» ВСЕ из закрытия, в чем принципиальное различие между этими двумя примерами.
Учитывая эти два способа создания объектов/методы:
var test = {}
test = (function(){
var a_method = function(print_me){
return "hello "+print_me;
}
return {print_me: a_method};
})();
test.print_me2 = function(print_me2){
return "hello "+print_me2;
}
test.print_me('world');
>>> returns "hello world"
test.print_me2('world');
>>> returns "hello world"
Я понимаю, что первый метод позволяет для частных переменных (которые, как разработчик питона в душе я не очень заботятся, чтобы использовать), но оба кажутся мне довольно равнодушными, только первый выглядит «более холодным» (как и во всех больших javascript-людях, похоже, делает это именно так), а второй способ выглядит очень пропуски и eacute ;.
Итак, как, в чем разница?
Я рассмотрел вопросы о закрытии здесь - большинство из них сосредоточено вокруг того, что или почему вы ими пользуетесь; Я понимаю их полезность, я просто хочу знать, почему вы делаете первый за второй и какие преимущества у него есть.
Я бы предпочел твердые доказательства по поводу гипотезы - не ища «это то, как это делают холодные дети», или «я слышал, что мозилла лучше использует память при использовании закрытия», а скорее качественное доказательство к одному из них «лучше», чем к другому.
это гораздо лучший ответ, чем раньше. И да, я понимаю, что я устанавливаю объект как результат непосредственно выполняемой функции, а не устанавливая свойство указанного объекта. Предположим, я пытаюсь сделать только «print_me», который будет единственным свойством на тестовый объект. Каковы преимущества этого в закрытии, а не как прямое назначение? – tkone
@tkone: Преимущество делать это в закрытии - это просто, что у вас есть закрытие. Вы можете создавать локальные переменные, чтобы не загрязнять глобальное пространство имен. Однако быть осторожным с глобальным пространством имен является проблемой, если вы пишете библиотечный код или плагины. Например, большая библиотека jQuery добавляет только два имени в глобальное пространство имен. – Guffa
ОК классный. это именно то, что я пытался выяснить. Я знаю, что добавление тонны имен в глобальное пространство имен - это плохая идея (следовательно, использование пространства имен), но просто хотелось узнать, делают ли люди закрытие, потому что они «горячие» или если они обслуживали утилиту в таком случае, как указано выше. – tkone