Что такое конструкция (function () {}) () в JavaScript? - PullRequest
708 голосов
/ 22 ноября 2011

Раньше я знал, что это значит, но сейчас я борюсь ...

Это в основном говорит document.onload?

(function () {

})();

Ответы [ 23 ]

5 голосов
/ 15 марта 2015

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

И объяснение синтаксиса таково: функция в первой круглой скобке () - это функция, у которой нет имени, и по следующей круглой скобке (); вы можете понять, что она вызывается во время ее определения. И вы можете передать любой аргумент во второй () скобке, который будет взят в функции, которая находится в первой скобке. Смотрите этот пример:

(function(obj){
    // Do something with this obj
})(object);

Здесь «объект», который вы передаете, будет доступен внутри функции через obj, так как вы захватываете его в сигнатуре функции.

4 голосов
/ 18 февраля 2017

Начните здесь:

var b = 'bee';
console.log(b);  // global

Поместите его в функцию, и она станет уже не глобальной - ваша основная цель.

function a() {
  var b = 'bee';
  console.log(b);
}
a();
console.log(b);  // ReferenceError: b is not defined -- *as desired*

Вызовите функциюнемедленно - упс:

function a() {
  var b = 'bee';
  console.log(b);
}();             // SyntaxError: Expected () to start arrow function, but got ';' instead of '=>'

Используйте скобки, чтобы избежать синтаксической ошибки:

(function a() {
  var b = 'bee';
  console.log(b);
})(); // OK now

Вы можете не указывать имя функции:

(function () {    // no name required
  var b = 'bee';
  console.log(b);
})();

Itне должно быть более сложным, чем это.

2 голосов
/ 22 ноября 2011

Самовыполняющаяся анонимная функция.Он выполняется сразу после его создания.

Один короткий и фиктивный пример, в котором это полезно:

function prepareList(el){
  var list = (function(){
    var l = []; 
    for(var i = 0; i < 9; i++){
     l.push(i);
    }
    return l;
  })();

  return function (el){
    for(var i = 0, l = list.length; i < l; i++){
      if(list[i] == el) return list[i];
    }
    return null;
  }; 
} 

var search = prepareList();
search(2);
search(3);

Поэтому вместо создания списка каждый раз вы создаете его только один раз (меньше накладных расходов).

2 голосов
/ 18 мая 2014

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

Код

var same_name = 1;

var myVar = (function() {
    var same_name = 2;
    console.log(same_name);
})();

console.log(same_name);

производит такой вывод:

2
1

Используя этот синтаксис, вы избегаете столкновения с глобальными переменными, объявленными в другом месте вашего кода JavaScript.

1 голос
/ 15 января 2017

IIFE (немедленно вызванное выражение функции) - это функция, которая выполняется, как только скрипт загружается и уходит.

Рассмотрим приведенную ниже функцию, написанную в файле с именем iife.js

(function(){
       console.log("Hello Stackoverflow!");
   })();

Этот код выше будет выполняться, как только вы загрузите iife.js, и напечатает ' Hello Stackoverflow! на консоли инструментов разработчика.

Подробное объяснение см. Выражение с немедленным вызовом функции (IIFE)

1 голос
/ 12 августа 2016

Еще одним вариантом использования является мемоизация, когда объект кэша не является глобальным:

var calculate = (function() {
  var cache = {};
  return function(a) {

    if (cache[a]) {
      return cache[a];
    } else {
      // Calculate heavy operation
      cache[a] = heavyOperation(a);
      return cache[a];
    }
  }
})();
0 голосов
/ 17 июля 2019

Это называется IIFE - выражение для немедленного вызова функции. Вот пример, чтобы показать его синтаксис и использование. Он используется для определения области применения переменных только до функции, а не за ее пределами.

(function () {
  function Question(q,a,c) {
    this.q = q;
    this.a = a;
    this.c = c;
  }

  Question.prototype.displayQuestion = function() {
    console.log(this.q);
    for (var i = 0; i < this.a.length; i++) {
      console.log(i+": "+this.a[i]);
    }
  }

  Question.prototype.checkAnswer = function(ans) {
    if (ans===this.c) {
      console.log("correct");
    } else {
      console.log("incorrect");
    }
  }

  var q1 = new Question('Is Javascript the coolest?', ['yes', 'no'], 0);
  var q2 = new Question('Is python better than Javascript?', ['yes', 'no', 'both are same'], 2);
  var q3 = new Question('Is Javascript the worst?', ['yes', 'no'], 1);

  var questions = [q1, q2, q3];

  var n = Math.floor(Math.random() * questions.length)

  var answer = parseInt(prompt(questions[n].displayQuestion()));
  questions[n].checkAnswer(answer);
})();
0 голосов
/ 11 сентября 2018

Следующий код:

(function () {

})();

называется немедленно вызванным функциональным выражением (IIFE).

Это называется функциональным выражением, поскольку ( yourcode )Оператор в Javascript заставить его в выражении.Разница между функциональным выражением и объявлением функции заключается в следующем:

// declaration:
function declaredFunction () {}

// expressions:

// storing function into variable
const expressedFunction = function () {}

// Using () operator, which transforms the function into an expression
(function () {})

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

После того, как у нас есть выражение, которое оценивает функциональный объект, мы можем немедленно вызвать функциональный объект с оператором ().Например:

(function() {

  const foo = 10;        // all variables inside here are scoped to the function block
  console.log(foo);

})();

console.log(foo);  // referenceError foo is scoped to the IIFE

Почему это полезно?

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

0 голосов
/ 26 июля 2018

Обычно мы не вызываем функцию сразу после того, как записали ее в программу.Проще говоря, когда вы вызываете функцию сразу после ее создания, она называется IIFE - причудливое имя.

0 голосов
/ 11 апреля 2018

Обычно код JavaScript имеет глобальную область применения. Когда мы объявляем глобальную переменную в ней, есть шанс использовать ту же самую дублирующую переменную в какой-то другой области разработки для какой-то другой цели. Из-за этого дублирования может произойти какая-то ошибка. Таким образом, мы можем избежать этих глобальных переменных, используя немедленно вызывающее выражение функции, это выражение является самореализующимся выражением. Когда мы сделаем наш код внутри этой IIFE выражения, глобальная переменная будет похожа на локальную область видимости и локальную переменную.

Два способа создания IIFE

(function () {
    "use strict";
    var app = angular.module("myModule", []);
}());

OR

(function () {
    "use strict";
    var app = angular.module("myModule", []);
})();

В приведенном выше фрагменте кода « var app » теперь является локальной переменной.

...