解释以下JavaScript声明?

时间:2013-08-09 20:04:45

标签: javascript

var ninja = (function(){
    function Ninja(){};
    return new Ninja();
})();

为什么上面的函数封装在括号中,为什么最后会有();

我认为它是一个构造函数,因为最后是();,但为什么对象用括号括起来?

4 个答案:

答案 0 :(得分:11)

此代码相当于:

function Ninja() {
    // nothing here
}

var ninja = new Ninja();

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

代码(function() {...})();基本上表示“将此处包含的任何函数立即执行并立即执行”。所以它创建了一个匿名函数并在之后调用它。

答案 1 :(得分:5)

它被称为Immediately-Invoked Function Expression(或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更改了该范围内的含义,并引用了使用.each()循环的当前DOM元素。因此,通过将this作为参数传递到IIFE(并调用该参数obj),我可以使用obj.property在{{1}范围之外引用this.property。 1}}。

请告诉我这是否有意义或者您有任何疑问:)

答案 2 :(得分:1)

  

为什么函数声明封装在'('s'以及为什么是   有一个'();'最后

同时声明并执行该函数。

您可能会看到:Named function expressions demystified - by Juriy "kangax" Zaytsev

答案 3 :(得分:0)

根据建议:参考Benalman

立即调用函数表达式(IIFE) 幸运的是,SyntaxError“修复”很简单。告诉解析器期望函数表达式的最广泛接受的方式只是包含在parens中,因为在JavaScript中,parens不能包含语句。此时,当解析器遇到function关键字时,它知道将其解析为函数表达式而不是函数声明。

// 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