2014-01-22 4 views
4

Я часто вижу эту картину:Что называется этот дизайн?

var suchAndSuch = new (function() { 
    this.thing = "something"; 
    this.whoaLookAtThat = function() { 
     return 4; 
    } 
    return { 
     'thing' : thing, 
     'whoaLookAtThat' : whoaLookAtThat 
    } 
})(); 

Что здесь происходит? Это часть заявления return, которая меня путает.

Я просто не использую это использование IIFE.

Если ничего, зная, что это называется, поможет мне исследовать его.

+0

этот код отсутствует «новый». с новым, это модуль, общедоступные методы которого могут ссылаться на частные переменные, определенные в IIFE. – dandavis

+0

Работает без него. Который я не могу объяснить. – Aerovistae

+0

Кто-нибудь хочет ОБЪЯСНИТЬ их вниз ...? Конечно нет. – Aerovistae

ответ

5

Это комбинация сразу исполняющей функции и (бит испорченного) закрытия. Я думаю, что ваш пример может быть немного испорчен, может быть лучше, если бы это было:

var suchAndSuch = (function() { 
    var thing = "something"; 
    function setThing(newThing){ 
     //maybe do some error checking here 
     thing = newThing; 
    }; 
    function getThing(){ 
     return thing; 
    }; 

    return { 
     getThing : getThing, 
     setThing : setThing 
    } 
})(); 

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

1

Это своего рода попытка иметь общедоступные/частные переменные в JavaScript ... Я считаю, что это называется модульным шаблоном.

var suchAndSuch = (function() { 
    var privateVariable = "something"; 
    var privateFunction = function() { 
     return 4; 
    } 
    return { 
     publicMethod1: function() { 
      return privateVariable; 
     }, 
     publicMethod2: function() { 
      return privateFunction(); 
     } 
    } 
})(); 

В принципе, любые переменные, объявленные внутри IIFE, будут частными. Затем вы возвращаете объект с помощью методов. Поскольку объект/методы были определены в той же области, что и частные переменные, методы все еще имеют к ним доступ. Однако ничего больше не будет.

+0

Итак, все, что до сих пор дергает меня, это то, что ваши общедоступные методы написаны как идентификаторы, а мои - как строковые литералы. Поэтому, если публичные и частные методы имеют одно и то же имя, используются строки, необходимые .... или ... в чем разница? – Aerovistae

+0

Когда дело доходит до объектов, если имя свойства не имеет пробела или специального символа, оно не обязательно должно быть строковым литералом. Это может быть и то. Но в любом случае к ним обращаются и используются одинаково (по большей части). то есть я мог бы сделать «publicMethod2», но он работает одинаково в любом случае. Однако было бы требованием быть строковым литералом, если бы я хотел получить имя свойства, например 'public method 1'. Есть пробелы, поэтому он должен быть строковым литералом. Тогда вам нужно будет получить к нему доступ как 'suchAndSuch ['public method 1'];' –

+0

Это называется «* раскрывающим шаблоном модуля *» - с использованием [IEFE] (http://benalman.com/news/2010/11/немедленно-вызывается-функция-выражение /), который возвращает объект – Bergi

1

Это называется самозапускающейся лямбдой. JS имеет область функций, поэтому, чтобы вежливо сохранить глобальное пространство имен, вы должны использовать функцию. Чтобы заставить его выполнить немедленно, как если бы это был код верхнего уровня с областью блока, вы завершаете его в (bla)() - следовательно, он вызывает самозапускание. Когда он фактически возвращает объект с некоторым подмножеством своей области как свойств, он обычно присваивается переменной и называется шаблоном модуля.

Практика возвращения другого объекта, кроме созданного new, является тем, что я иногда вижу как способ защиты кода, который забывает new и просто вызывает конструктор. В этом контексте, однако, не имеет смысла назначать свойства для this, поскольку this является объектом window. В противном случае, если вы используете new, this GCed немедленно, поэтому он все равно не имеет смысла.

Смежные вопросы