Объясните следующий оператор JavaScript?
var ninja = (function(){
function Ninja(){};
return new Ninja();
})();
Почему указанная выше функция заключена в круглые скобки и почему существует ();
в конце?
Я думаю, что это функция-конструктор из-за ();
в конце, но почему объект, заключенный в круглые скобки?
Ответы
Ответ 1
Этот код эквивалентен:
function Ninja() {
// nothing here
}
var ninja = new Ninja();
Хотя в коде, который вы указали, функция/объект Ninja не является глобальной областью.
В коде (function() {...})();
в основном говорится: "Возьмите любую функцию внутри и немедленно ее выполните". Поэтому он создает анонимную функцию и сразу вызывает ее.
Ответ 2
Он вызвал Выражение с немедленной вызывной функцией (или IIFE). Он создает новую область действия и немедленно выполняет содержимое. Для этого есть много применений; тот, который я использую больше всего, - это когда ключевое слово this
изменит значение, например. в
var someClass = function() {
this.property = something;
this.update = (function(obj) {
function() {
$('.el').each(function() {
$(this).html( obj.property );
});
};
)(this);
};
В то время как я хочу ссылаться на this.property
внутри $('.el').each()
, this
изменяет значение внутри этой области и ссылается на текущий элемент DOM, который зацикливается с помощью .each()
. Поэтому, передав this
в качестве параметра в IIFE (и вызывая этот параметр obj
), я могу использовать obj.property
для обозначения того, что есть this.property
, когда выходит за пределы $('.el').each( ..., function() { ... });
.
Сообщите мне, если это имеет смысл или у вас есть какие-либо вопросы:)
Ответ 3
Почему декларация функции инкапсулирована в '(а также почему есть a '();' в конце
Его объявление и выполнение функции в одно и то же время.
Вы можете увидеть: Именованные функциональные выражения, демистифицированные - Юрием "kangax" Зайцевым
Ответ 4
Как было предложено: Обращаясь к Бенальману
Выражение с немедленной вызывной функцией (IIFE) К счастью, исправление SyntaxError прост. Самый распространенный способ сказать парсеру ожидать выражения функции - это просто вставить в parens, потому что в JavaScript parens can not содержат инструкции. В этот момент, когда синтаксический анализатор встречает ключевое слово function, он разбирается в нем как выражение функции, а не объявление функции.
// Either of the following two patterns can be used to immediately invoke
// a function expression, utilizing the function execution context to
// create "privacy."
(function(){ /* code */ }()); // Crockford recommends this one
(function(){ /* code */ })(); // But this one works just as well