Как вы объясните эту структуру в JavaScript? - PullRequest
15 голосов
/ 09 октября 2008
(function() 
 {
     //codehere
 }
)();

Что особенного в этом синтаксисе? Что значит ()(); значит?

Ответы [ 7 ]

40 голосов
/ 09 октября 2008

Создает анонимную функцию, замыкание и все, и final () говорит ей, чтобы она выполнялась сама.

Это в основном так же, как:

function name (){...}
name();

Так что в основном в этом коде нет ничего особенного, это просто «ярлык» для создания метода и его вызова без необходимости называть его именем.

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

4 голосов
/ 09 октября 2008

Это вызываемая анонимная функция.

Цель этого - создать новую область видимости, из которой локальные переменные не будут выбрасываться. Например:

var test = 1;
(function() {
  var test = 2;
})();
test == 1 // true

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

Фрагмент ниже приведет к ошибке:

var aVariable = 1
var myVariable = aVariable

(function() {/*...*/})()

Вот что он на самом деле делает:

var aVariable = 1;
var myVariable = aVariable(function() {/*...*/})
myVariable();

Другой способ создания новой области видимости блока - использовать следующий синтаксис:

new function() {/*...*/}

Разница в том, что первый метод не влияет на то, на что указывает ключевое слово "this", а второй - на

.

В Javascript 1.8 также есть оператор let, который выполняет то же самое, но, разумеется, он не поддерживается большинством браузеров.

2 голосов
/ 09 октября 2008

Это использование в основном эквивалентно внутреннему блоку в C. Он предотвращает видимость переменных, определенных внутри блока. Так что это удобный способ создания одноразовых классов с закрытыми объектами. Только не забудьте return this;, если вы используете его для создания объекта.

var Myobject=(function(){
    var privatevalue=0;
    function privatefunction()
    {
    }
    this.publicvalue=1;
    this.publicfunction=function()
    {
        privatevalue=1; //no worries about the execution context
    }
return this;})(); //I tend to forget returning the instance
                  //if I don't write like this
2 голосов
/ 09 октября 2008

Это самоисполняющаяся анонимная функция. () В конце фактически вызывает функцию.

Хорошая книга (я читал), которая объясняет некоторые случаи использования этих типов синтаксиса в Javascript: Объектно-ориентированный JavaScript .

1 голос
/ 18 октября 2008

См. Также превосходный «JavaScript: Хорошие детали» Дугласа Крокфорда, доступный от О'Рейли, здесь:

http://oreilly.com/catalog/9780596517748/

... и на видео в YUIblog, здесь:

http://yuiblog.com/blog/2007/06/08/video-crockford-goodstuff/

0 голосов
0 голосов
/ 09 октября 2008

Материал в первом наборе скобок соответствует функции. Затем второй набор скобок выполняет эту функцию. Так что, если у вас есть что-то, что автоматически запускается при загрузке, это то, как вы заставили бы его загрузить и выполнить.

...