这段 JavaScript 代码有什么区别吗?

4
我是一名有用的助手,可以为您翻译文本。
我看到了各种以以下两种方式实现的代码。我总是使用第二种(2.)。我想在这里知道两件事。
  1. 这两个代码之间有什么区别吗?

  2. 如果有的话,哪一个是最佳实践(以及为什么)?

1.

(function () {
    //some code here, angular code
})();

2.

 (function () {
     //some code here, angular code
 });

请还建议一些关于这方面很好的博客或书籍,因为我想学习更详细的内容。提前感谢大家。

6
2号从未被调用。 - charlietfl
4个回答

9

是的,你没有执行第二个函数。

在第一个例子中,你声明了一个匿名函数,稍后不带参数运行它。

在第二个例子中,你只是声明了它,但没有运行它。

() 可以让它运行,在这种情况下,通过不传递任何参数来运行它。

这个会执行匿名函数:

    (function () {
        //some code here, angular code
    })();

这个不会执行它:

    (function () {
        //some code here, angular code
    });

例如,如果您有一个参数,您可以像这样传递它:
    (function (c) {
        // c.log() is same as console.log
        c.log("hello");
    })(console);

注意: 我添加了参数示例,因为没有任何参数时不太明显。

编辑:

正如@Osman在评论中指出的那样,第一个被称为IIFE

这种模式非常常见,几年前社区就已经同意了一个术语:IIFE,即立即调用函数表达式。


3
第二个是声明,第一个是声明和执行。

1

区别:

第一个执行匿名函数表达式

    (function () {
        //some code here, angular code
    })();

第二个不执行它:
    (function () {
        //some code here, angular code
    });

匿名函数是没有名称的函数。

背景:

基本上,我们首先用括号将 匿名 函数的 声明 包装起来,例如:(),使其成为一个函数 表达式

    // this is a function declaration:
    function () {
        //some code here
    }

    // this is a function expression
    (function () {
        //some code here
    });

这段代码本身并没有作用,因为我们既没有执行它,也没有在当前作用域内声明它。换句话说,它是无用的。了解函数声明和函数表达式的区别

现在,我们可以像jQuery一样将函数表达式用作其他函数的参数:

    // now jQuery is taking the function expression as parameter
    $(function () {
        //some code here
    });

或者,我们可以通过在末尾使用()来执行函数本身(实际上这是我们调用任何函数的方式-在这种情况下没有任何参数):

    // Now the function expression gets executed.
    (function () {
        //some code here, angular code
    })();

这也被称为立即调用函数表达式或IIFE

上面的示例没有任何参数。但是,如果您有一个参数,可以在执行时像这样传递它:

    (function (c) {
        // Here c.log() is same as console.log()
        c.log("hello");
    })(console);

注意:我添加了参数示例,因为没有任何参数可能不太明显。

最佳实践:

由于它们在功能上是不同的,所以最佳实践的问题并不出现。通常情况下,我们在需要在不同的作用域中执行某些操作且不希望在当前作用域中留下任何函数声明、变量声明等痕迹时使用IIFE。

进一步阅读:

关于此问题的更多讨论可以在以下链接中找到:

  1. JavaScript中的(function() { } )()构造是什么?
  2. 将整个Javascript文件包装在匿名函数中的目的是什么,例如“(function(){ … })()”?
  3. 自执行函数在javascript中的作用是什么?
  4. 《你不知道的JavaScript:作用域和闭包》。

我之前真的不知道这个,谢谢伙计。你知道有没有关于这个概念有详细解释的文章吗?我想学更多。 - Kaushik Thanki

0
第一个是IIFE(立即调用函数表达式),正如其他人所说,有关IIFE的更多信息,请查看Kyle Simpson(《You don't know JS》的作者)的this repo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接