解释以下 JavaScript 语句

Explain the following JavaScript statement?

本文关键字:语句 JavaScript 解释      更新时间:2023-09-26
var ninja = (function(){
    function Ninja(){};
    return new Ninja();
})();
为什么

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

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

此代码等效于:

function Ninja() {
    // nothing here
}
var ninja = new Ninja();

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

代码(function() {...})();基本上是"获取此处包含的任何函数并立即执行它"。因此,它正在创建一个匿名函数,并在之后立即调用它。

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

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

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

让我知道这是否有意义,或者您是否有任何疑问:)

为什么

函数声明封装在'('s中,以及为什么 最后有一个"((;">

它同时声明和执行函数。

您可能会看到: 命名函数表达式揭秘 - 由 Juriy "kangax" Zaytsev

正如建议: 参考贝纳尔曼

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

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