解释下面的javascript语句?

Explain the following JavaScript statement?

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
var ninja = (function(){
    function Ninja(){};
    return new Ninja();
})();

为什么上面的函数被封装在括号中,为什么结尾有一个();

我认为它是一个构造器函数,因为末尾有();,但是为什么对象被括在括号中呢?


此代码相当于:

1
2
3
4
5
function Ninja() {
    // nothing here
}

var ninja = new Ninja();

虽然在您列出的代码中,函数/对象忍者不是全局范围。

代码(function() {...})();基本上说"接受这里包含的任何函数,并立即执行它"。所以它正在创建一个匿名函数,然后立即调用它。


它被称为立即调用的函数表达式(或IIFE)。它创建一个新的作用域并立即执行内容。它有很多用途;我使用最多的是当this关键字改变含义时,例如

1
2
3
4
5
6
7
8
9
10
var someClass = function() {
    this.property = something;
    this.update = (function(obj) {
        function() {
            $('.el').each(function() {
                $(this).html( obj.property );
            });
        };
    )(this);
};

虽然我想在$('.el').each()中引用this.property,但this在该范围内改变了含义,并引用了当前正与.each()循环通过的dom元素。因此,通过将this作为参数传递到IIFE(并调用该参数obj中),我可以使用obj.property$('.el').each( ..., function() { ... });范围之外引用什么是this.property

如果有任何问题,请告诉我。)


Why is the function declaration encapsulated in '('s and also why is
there a '();' in the end

它同时声明和执行函数。

您可能会看到:命名函数表达式被juriy"kangax"zaytsev取消了定义。


如建议:参考Benalman

立即调用的函数表达式(IIFE)幸运的是,语法错误"fix"很简单。告诉解析器期望函数表达式的最广泛接受的方法就是用parens包装,因为在javascript中,parens不能包含语句。此时,当解析器遇到函数关键字时,它知道将其解析为函数表达式而不是函数声明。

1
2
3
4
5
6
7
8
// Either of the following two patterns can be used to immediately invoke
// a function expression, utilizing the function's execution context to
// create"privacy."


(function(){ /* code */ }()); // Crockford recommends this one

(function(){ /* code */ })(); // But this one works just as well