Объясните следующий оператор 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() { ... });.

Сообщите мне, если это имеет смысл или у вас есть какие-либо вопросы:)

Ответ 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