解释以下JavaScript声明?

San*_*ngh 28 javascript

var ninja = (function(){
    function Ninja(){};
    return new Ninja();
})();
Run Code Online (Sandbox Code Playgroud)

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

我认为这是一个构造函数,因为();最后,但为什么对象包含在括号中?

小智 12

此代码相当于:

function Ninja() {
    // nothing here
}

var ninja = new Ninja();
Run Code Online (Sandbox Code Playgroud)

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

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


asi*_*frc 5

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

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

虽然我想引用this.property里面的$('.el').each(),this改变了范围内的含义,指的是正在通过循环与当前的DOM元素.each().因此,通过this将参数作为参数传递给IIFE(并调用该参数obj),我可以obj.property用来指代什么this.property时候超出范围$('.el').each( ..., function() { ... });.

如果这有意义或者您有任何问题,请告诉我:)