Анонимное закрытие 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 () {}());
Выражение функции