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

时间:2017-02-07 17:16:59

标签: javascript angularjs

我见过以下两种方式实现的各种代码。我总是使用第二个(2.)。我想在这里知道两件事。

  1. 这两个代码有什么区别吗?

  2. 哪一个是最佳实践(以及为什么)?

  3. 1

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

    2

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

    请在这方面建议我一些好的博客或书籍,因为我想更详细地学习。谢谢大家提前..

4 个答案:

答案 0 :(得分: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,代表立即调用函数   表达

答案 1 :(得分:3)

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

答案 2 :(得分:1)

差:

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

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

第二个没有执行它:

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

anonymous function是一个没有名字的功能。

背景:

基本上,首先我们将匿名函数声明包含在第一个括号中,例如:(),以使其成为函数 expression

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

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

它本身没有任何作用,因为我们既没有执行它,也没有在当前范围内声明它。换句话说,它没用。详细了解difference between function declaration & function expression

现在,我们可以使用函数表达式作为其他函数的参数,就像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
    })();

这也称为Immediately-Invoked Function Expression or IIFE

以上示例没有任何参数。但是,如果您有参数,则可以在执行时将其传递出去:

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

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

最佳实践:

由于功能上它们不同,因此最佳实践问题并未出现。通常我们在我们想要在不同于当前范围和范围的范围内执行某些事情的情况下使用IIFE。我们不想在当前范围内留下任何功能声明,变量声明等的足迹。

进一步阅读:

有关这方面的更多讨论可以在以下链接中找到:

  1. What is the (function() { } )() construct in JavaScript?
  2. What is the purpose of wrapping whole Javascript files in anonymous functions like “(function(){ … })()”?
  3. What is the purpose of a self executing function in javascript?
  4. You Don't Know JS: Scope & Closures

答案 3 :(得分:0)

第一个是IIFE(立即调用的函数表达式),正如其他人所说,有关IIFE检查的更多信息this repo由Kyle Simpson(你不知道JS的作者)