2012-05-19 5 views
2

Я видел два пути ... первый имеет для меня смысл.Правильное использование синтаксиса шаблона модуля?

Скобки для самостоятельного запуска размещаются непосредственно после функциональных скобок. Все включено между круглыми скобками, чтобы сделать это выражением функции. Ссылка here

(function() { 
    // ... all vars and functions are in this scope only 
    // still maintains access to all globals 
}()); 

и этот стиль, где само-исполнение скобка является местом после скобок, которые создают выражение функции. Ссылочная here

var Var = (function (window, undefined) 
{ 

})(); 

Я не уверен, если переменная имеет значение в синтаксисе ...?

+0

Вы, кажется, говорите о [непосредственных функциях] (http://stackoverflow.com/questions/939386/immediate-function-invocation-syntax), а не модульном шаблоне. Если это так, есть другой подход: '! Function() {/ * do stuff * /}();' Но в чем вопрос? – kojiro

+0

Оба примера выше относятся к шаблону модуля (со ссылками). Я хочу знать, почему круглые скобки находятся в разных местах для каждого. –

ответ

4

Ответ на ваш вопрос находится в ссылке около immediate functions в моем первом комментарии. По сути, если вы просто хотите немедленную функцию, пока объявление самой функции обернуто в круглые скобки, не имеет значения, будут ли вызывающие парнеры следовать за фигурными фигурными скобками или следовать за круглыми скобками. Однако, если вы не хотите, оберточной скобки, то назначение Var становится актуальным, так как это будет работать:

var Var = function() { 
    // do stuff; return stuff; 
}(); 

Но это не будет:

function() { 
    // do stuff; 
}(); 

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

+0

Непосредственная функция, не назначенная var, требует обертывания в круглых скобках, в то время как немедленная функция, назначенная var, не требует округления скобок ... Cool. Можете ли вы рассказать об этом в моем вопросе о шаблоне модуля .... вы подразумеваете/предполагаете, что второй пример, который я опубликовал выше, слишком убит, что ему не нужны скобки для обертывания? –

+0

Строго говоря, это не требует обертывания parens, но я не считаю их излишними. Подумайте, что кто-то, читающий ваш код, может подумать, что вы назначаете * функцию * на 'Var', которая будет выполнена позже. Обернув его в parens, вы даете понять, что происходит что-то еще. – kojiro

+0

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

0

Это на самом деле 2 разных шаблона. 2-й шаблон называется the revealing module pattern, так как в нем показаны некоторые из локальных жителей в глобальном пространстве имен.

+0

Одна вещь, которая ускользает от меня, это то, что любая функция может быть записана для возврата другой функции. Это позволяет написать функцию с частными/общедоступными переменными и функциями. Единственное, что я вижу, полученное с помощью шаблона модуля или выявления шаблона модуля, - это глобальный импорт. Я использую его по умолчанию b.c. все остальные делают ... но, похоже, функция будет делать то же самое по существу. –

3

Там нет никакой разницы между:

(function() {})(); 

и

(function() {}()); 

Douglas Крокфорд сторонников второй, хотя (так JSLint будет жаловаться на первый стиль). Он говорит, что первый - «контрпродуктивный», что бы это ни значило ... Я предпочитаю первое.

+0

Это «операция» над функцией ... она делает это немедленно ... имеет смысл поставить ее близко к тому, на чем она работает ... мой один цент. –

+0

Я все еще не убежден, нужно ли полностью отказаться от внешних парен. Прекрасно работает для меня. – weiglt