Странный синтаксис JavaScript, подобный этому: (function () {// code}) () ;? - PullRequest
5 голосов
/ 27 августа 2009

Что означает приведенный ниже JavaScript? Почему функция встроена в ()?

(function() {
    var b = 3;
    a += b;
}) ();

Ответы [ 8 ]

13 голосов
/ 27 августа 2009

Это функционально эквивалентно выполнению чего-то вроде:

var myFunc = function(){
    var b = 3;
    a += b;
};

myFunc();

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

5 голосов
/ 27 августа 2009

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

4 голосов
/ 27 августа 2009

Это анонимная функция.

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

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

Для дальнейшего чтения

Javascript анонимные функции

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

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

function Pet(name, species, hello)
{    
          this.name = name;    
          this.species = species;    
          this.hello = hello;

          function sayHello()    
          {    
              alert(this.hello);    
          }

          this.sayHello = sayHello;    
      }

Но немного удобнее и лаконичнее сделать все за один шаг:

 function Pet2(name, species, hello)
 {
      this.name = name;    
      this.species = species;    
      this.hello = hello;

      this.sayHello = function()      
      {     
          alert(this.hello);    
      }    
  }
2 голосов
/ 27 августа 2009

То, что вы написали, является анонимной функцией, вызываемой немедленно. Причиной для этого является использование частных переменных. Если вместо вашего кода будет:

var b = 3;
a += b;

b будет глобальной переменной. Так что если вам нужно в глобальном коде частную переменную, это способ сделать это.

1 голос
/ 27 августа 2009

Ответ Джастина объясняет это довольно хорошо, но я подумал, что просто добавлю, что первый набор скобок (открывающий перед function) на самом деле совершенно не нужен для выполнения программы. Однако для удобства чтения это очень важно! Когда я вижу это:

(function() {

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

var x = (function() {
    return 4;
})();

var y = function() {
    return 4;
};

// typeof x == integer (4)
// typeof y == function
1 голос
/ 27 августа 2009

Функции в javascript являются объектами и могут использоваться как объекты. Так, например, вы можете сделать это:

var a = function() {alert("done");};
a();

Это обычно используется в различных функциях, где вы должны передать некоторую логику внутрь. Например, функция «sort» для массивов ожидает, что функциональный объект будет передан внутрь, чтобы определить, как сортировать массив:

var a = [{id: 15, name: 'test'},
         {id: 11, name: 'asd'},
         {id: 88, name: 'qweqwe'}];
a.sort(function(a,b) {
    if (a.id > b.id) return 1; //Put a after b
    if (a.id < b.id) return -1; //Put a before b
    if (a.id == b.id) return 0; //Don't make no changes
});

Затем метод sort сортирует предоставленную функцию со всеми видами элементов массива для ее сортировки.

То, что делает ваш пример - он создает объект функции и просто мгновенно запускает его.

1 голос
/ 27 августа 2009

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

Это внутри скобок, чтобы предотвратить синтаксическую ошибку. Без скобок за ключевым словом function должен следовать идентификатор.

Вы также можете сделать это, чтобы поместить функцию в переменную и затем вызвать ее:

var x = function() {
   var b = 3;
   a += b;
}
x();

Обратите внимание, что скобки не нужны, когда ключевое слово function не первое.

1 голос
/ 27 августа 2009

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

Это интенсивно используется такими инструментальными наборами Ajax, как JQuery, Dojo и т. Д., Для определения времени загрузки и обхода многих проблем и недостатков браузера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...