解释下面的JavaScript语句?

解释下面的JavaScript语句?,javascript,Javascript,为什么上面的函数封装在括号中,为什么有一个()在最后 我认为这是一个构造函数,因为()结尾,但为什么对象被括在括号中 为什么函数声明封装在“(”中?为什么 最后有一个“();” 它同时声明和执行函数 您可能会看到:此代码相当于: var ninja = (function(){ function Ninja(){}; return new Ninja(); })(); 尽管在您列出的代码中,函数/对象Ninja不是全局范围 代码(function(){…})(;基本上是说“获取

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

我认为这是一个构造函数,因为
()结尾,但为什么对象被括在括号中

为什么函数声明封装在“(”中?为什么 最后有一个“();”

它同时声明和执行函数


您可能会看到:

此代码相当于:

var ninja = (function(){
    function Ninja(){};
    return new Ninja();
})();
尽管在您列出的代码中,函数/对象Ninja不是全局范围

代码
(function(){…})(;
基本上是说“获取这里包含的任何函数,并立即执行”。因此它创建了一个匿名函数,然后立即调用它。

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

function Ninja() {
    // nothing here
}

var ninja = new Ninja();
虽然我想在
$('.el').each()
中引用
this.property
this
在该范围内更改了含义,并引用了当前的DOM元素,该元素正与
.each()
循环。因此,通过将
this
作为参数传递到IIFE中(并调用该参数
obj
)当超出
$('.el').each(…,function(){…})的范围时,我可以使用
obj.property
来引用什么是
此.property


让我知道这是否合理,或者如果您有任何问题:)

如建议:参考

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

var someClass = function() {
    this.property = something;
    this.update = (function(obj) {
        function() {
            $('.el').each(function() {
                $(this).html( obj.property );
            });
        };
    )(this);
};

我建议阅读,另请参阅:@KevinDeVoe您的副本更好
// 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