2012-01-23 3 views
1

Можно создать дубликат:
What do parentheses surrounding a JavaScript object/function/class declaration mean?Синтаксис объявления переменной? вар а = (функция() {})()

Я нашел следующий код в веб-сайте.

var testModule = (function(){ 

    var counter = 0; 

    return { 

     incrementCounter: function() { 

      return counter++; 

     }, 

     resetCounter: function() { 

      console.log('counter value prior to reset:' + counter); 

      counter = 0; 

     } 

    }; 

})(); 

Так следует синтаксису var a = (blah balh..)()

Что это на самом деле означает? В чем смысл объявления переменной, например a =()() ..

+0

@Shark: sure ... i –

+1

Обратите внимание, что это не '(blah blah)()', это '(function() {blah})()'. То есть этот синтаксис имеет смысл только для функциональных выражений. – nnnnnn

ответ

5

Он определяет одноразовую функцию и выполняет ее немедленно. Код Предоставленная назван Module Pattern - смотрите здесь для получения дополнительной информации о его свойствах: http://www.yuiblog.com/blog/2007/06/12/module-pattern/

нормальная функция может быть создана, как это:

var f1 = function() { 
    console.log('bar'); 
}; 

И вы могли бы впоследствии называть его так:

f1(); 

Но в данном примере вы предоставили, функция как определяется и выполняется один раз, и эта функция возвращает объект с двумя функциями: incrementCounter и resetCounter. Вы можете назвать их так: testModule.incrementCounter() и testModule.resetCounter()

Шаблон модуля полезен, когда у вас есть один объект, и вы хотите инкапсулировать некоторые свойства, доступные только для функций, определенных в закрытии.

2

Выполняется анонимная функция, и для переменной присваивается возвращаемое значение.

+1

Любопытно, что это можно рассматривать как закрытие по сравнению с 'function() {}();' не является закрытием и только анонимной функцией? –

+1

@Matt Lo: Они эквивалентны: function() {}() и (function() {})() В качестве наилучшей практики рекомендуется использовать вторую форму. – ryanlahue

+0

@rla: 'function() {}()' is 'SyntaxError'. Объявление функции требует имени. Вам нужно удалить двусмысленность между объявлением и анонимной функцией с дополнительным синтаксисом. –