Как вы объясните эту структуру в JavaScript?
(function()
{
//codehere
}
)();
Что особенного в этом синтаксисе?
Что значит()(); значит?
Ответы
Ответ 1
Создает анонимную функцию, закрытие и все, а final() сообщает ей выполнить сам.
Это в основном то же самое, что:
function name (){...}
name();
Таким образом, в принципе нет ничего особенного в этом коде, это просто "ярлык" для создания метода и вызова его без необходимости его называть.
Это также означает, что функция является одной или внутренней функцией для объекта и наиболее полезна, когда вам нужны функции закрытия.
Ответ 2
Это анонимная функция, вызываемая.
Целью этого является создание новой области, из которой локальные переменные не истекают. Например:
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, который выполняет одно и то же, но, разумеется, он не поддерживается большинством браузеров.
Ответ 3
Это самозапускающаяся анонимная функция. Функция() в конце фактически вызывает функцию.
Хорошая книга (я прочитал), которая объясняет некоторые применения этих типов синтаксиса в Javascript объектно-ориентированный Javascript.
Ответ 4
Это использование в основном эквивалентно внутреннему блоку в 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
Ответ 5
См. также Дуглас Крокфорд превосходный "JavaScript: хорошие детали", доступный от O'Reilly, здесь:
http://oreilly.com/catalog/9780596517748/
... и на видео в YUIblog, здесь:
http://yuiblog.com/blog/2007/06/08/video-crockford-goodstuff/
Ответ 6
Материал в первом наборе скобок вычисляет функцию. Второй набор скобок выполняет эту функцию. Поэтому, если у вас есть что-то, что нужно запускать автоматически, то это может привести к его загрузке и выполнению.
Ответ 7
Джон Ресиг объясняет самопроизвольные анонимные функции здесь.