Анонимное закрытие Javascript

Я много читал о закрытии в Javascript Что это за фигурные скобки? Я прочитал mozilla.org, в котором говорится, что закрытие должно быть определено как

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

но на http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html он говорит, что функция закрытия

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

Какая разница или последняя неверна? Какова цель последнего()? Не могли бы вы поместить некоторые параметры внутри? Я ищу хорошую ссылку.

Изменить: Кроме того, есть пример на mozilla.org

var makeCounter = function() {
var privateCounter = 0;
  function changeBy(val) {
    privateCounter += val;
  }
  return {
    increment: function() {
      changeBy(1);
    },
    decrement: function() {
      changeBy(-1);
    },
    value: function() {
      return privateCounter;
    }
  }  
};

почему точка с запятой необходима для этой "функции"? Если его нужно вызвать сразу после объявления, перед конечной точкой с запятой следует поставить a(). Но нет.

Ответы

Ответ 1

Синтаксис

(function(){...})()

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

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

Для наглядности:

Если мы имеем следующую функцию

   function hello() {
      alert("Hello");
   }

Мы можем вызвать функцию со следующим

hello()

Что вызывает функцию 'hello'. Но если мы не хотим указывать ему имя, но все же вызывать его, то мы можем сделать

(function hello() {
   alert("Hello");
})()

Что будет делать то же самое, что и предыдущий пример вызова hello

Однако в этом сценарии нет смысла указывать функции имя "привет", поэтому мы можем просто удалить ее:

(function() {
    alert("Hello");
})()

Какая обозначение используется в вашем исходном вопросе.

Ответ 2

В этом примере показано Выражение неотложных функций или IIFE. Он говорит переводчику:

  • здесь есть функция
  • у него нет имени
  • держите его подальше от глобальной области видимости, т.е. 'window'
  • назовите его сейчас

Да, вы можете поместить параметры внутри last(). Например:

(
    function(username){
        alert("Hello " + username);
    }
)("John Smith")

Closures - это функция javascript, которая позволяет нам реализовать скрытие данных, что примерно эквивалентно частным переменным в таких языках, как С++ или Java.

function getBmiCalculator(height, weight) {
    // These are private vars
    var height = height;
    var weight = weight;

    function calculateBmi(){
        return weight / (height * height);
    }
    return calculateBmi;
}

var calc = getBmiCalculator(1.85, 90);

// calc still has access to the scope where height and weight live.
var bmi = calc();
alert(bmi);

В этом примере высота и вес не могут быть собраны в мусор, пока не будет уничтожен calc. Раздел памяти или "область видимости", где существуют высота и вес, "Закрыты"

Ответ 3

Нет никакой разницы. Вы также можете сделать это:

true && function(){ /* code */ }();
0,function(){ /* code */ }();

!function(){ /* code */ }(); // Facebook style
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// with new    
new function(){ /* code */ }
new function(){ /* code */ }() // if you need arguments then use brackets

Ответ 4

оператор группировки может окружать описание функции, как без круглых скобок вызова, а также включая круглые скобки вызовов. То есть оба выражения ниже соответствуют правилу FE:

      (function () {})();
      (function () {}());

Выражение функции