Почему нам нужно, чтобы IIFE имел область видимости модуля в Javascript?

Предположим, у меня есть core.js

var ajax = function(){};
var something = function(){super};
var globalconstant = 5;
var someutilitymodule = {
onekey: something;
twokey: something;
}

Если я включу это в свой файл как <script src="core.js">

1) Я загрязняю глобальное пространство имен

2) Можно [заменить/заменить] другой переменной.

Однако разве создание объекта не решит проблему? То есть я делаю core.js вот так

core = 
{
    ajax : function(){},
    something : function(){super},
    globalconstant : 5,
    someutilitymodule = {
                        onekey: something;
                        twokey: something;
                        }
}

В чем основная проблема этого подхода? Это потому, что вы не можете получить доступ к другим элементам, пока не будет создан полный объект? Например, core = {a:"Foo" , b:a} не будет работать? Однако я мог бы решить это с помощью

core = {};
core.a="Foo";
core.b=core.a;

Почему мы должны входить в IIFE (выражение немедленно вызываемой функции), если мы действительно не заинтересованы в замыканиях? Для «пространства имен модуля» в Javascript, которое не возражает против того, чтобы все было общедоступным в другом пространстве имен, не будет ли этот подход работать и создавать эффект модуля в Javascript?

Есть ли какие-либо указатели, чтобы прочитать больше об этом? Я знаю, что это немного расплывчато, но я новичок в таких понятиях, как IIFE requirejs и т. Д. Поэтому пытаюсь понять с точки зрения новичка.


person Nishant    schedule 28.08.2014    source источник
comment
IIFE позволяют вам иметь локальные данные, к которым нельзя получить доступ извне.   -  person Felix Kling    schedule 29.08.2014
comment
IIFE всегда упоминается вместе с областью видимости модуля, как будто нет другого способа создать область видимости модуля. IIFE выполняет определение объема модуля с помощью частных данных - правильно. Если вам не нужны личные данные, но вам нужна область видимости модуля, этот подход просто прекрасен, нет? Модули Pythons, я думаю, представляют собой набор пар ключ-значение внутри! Он делает это внутри, здесь мы явно говорим, что core.a = Foo; это моя мысль.   -  person Nishant    schedule 29.08.2014
comment
core = {a:"Foo" , b:a} не будет работать, потому что core.b не предполагает, что текущий корень - core. core = {a:"Foo" , b: core.a} будет работать, поэтому аргумент о доступе к другим элементам недействителен. Эта статья Бена Алмана довольно хорошо объясняет IIFE   -  person Tyblitz    schedule 29.08.2014
comment
Спасибо, я этого не знал. Так что да, этот аргумент действителен. Да, я читал статью Бена Алмана IIFE. Будет пересматривать.   -  person Nishant    schedule 29.08.2014
comment
Вы имеете в виду someutilitymodule = {onekey: this.something;}? Это сбивает с толку :P . NVM Я посмотрю на это. Хороший момент, хотя.   -  person Nishant    schedule 29.08.2014
comment
О, я ошеломлен комментарием @PHPglue. Это точно не сработает. Поскольку вы находитесь в глобальном контексте (window), this.something относится к window.something, поэтому в этом случае вам понадобится this.core.a, что в основном совпадает с core.a. Вы должны использовать только this в области действия функции.   -  person Tyblitz    schedule 29.08.2014
comment
Это не то, что я имел ввиду. Должен быть core.something в core.someutilitymodule.   -  person StackSlave    schedule 29.08.2014
comment
Хорошо, да, это правильно. это обычно делает его зависимым от вызываемого.   -  person Nishant    schedule 29.08.2014
comment
@Tyblitz: core = {a:"Foo" , b: core.a} не работает, потому что core еще не имеет значения, когда вы пытаетесь получить к нему доступ (b: core.a).   -  person Felix Kling    schedule 29.08.2014
comment
@FelixKling, мой плохой. Я тестировал это раньше, но разница была примерно такой: core = {a: 2, b: function() { return core.a }}, которая, конечно, выполняется только при вызове функции. Извините и спасибо за указание!   -  person Tyblitz    schedule 29.08.2014
comment
Таким образом, аргумент в пользу написания ссылок на себя на более позднем этапе остается в силе.   -  person Nishant    schedule 29.08.2014


Ответы (1)


Этот вопрос связан с JavaScript - преимущества литерала объекта .

«Обозначение объекта» — это технический термин для этого. Это один из наиболее часто используемых шаблонов для разделения кода в JavaScript, хотя шаблон модуля, такой как http://css-tricks.com/how-do-you-structure-javascript-the-module-pattern-edition/ является более сложной формой и использует только IFFE чтобы получить дополнительные функции, такие как частные переменные, используя замыкания.

Однако к переменным IFFE нельзя будет получить доступ позже, если вы сразу не определите методы в функции. Вы не можете расширить методы для использования этих переменных IIFE позже.

Например :

//counter here is the iife functions' counter variable
var module = (function(){var counter=1; return {getCounter: function(){return counter}}})()

//counter here is the global counter variable as it was created from the global scope
module.setCounter = function(arg){counter = arg + counter}
person Nishant    schedule 29.08.2014