【问题标题】:Why do we wrap the function in parenthesis two times in a statement? [duplicate]为什么我们在语句中将函数括在括号中两次? [复制]
【发布时间】:2012-08-15 06:33:04
【问题描述】:

可能重复:
What is the purpose of a self executing function in javascript?
Explain JavaScript's encapsulated anonymous function syntax

例如:

(function($) {
document.getElementById("foo").innerHTML = 'bar';
})();

我知道我们想创建自己的作用域来防止变量冲突,但是为什么 javascript 需要有 ()()?

【问题讨论】:

  • 两者都不是真正的副本。这个问题承认函数的范围问题,但质疑第二组括号的目的。

标签: javascript


【解决方案1】:

函数中的第一个结果,与(2) 导致2 的方式相同。第二个调用它。

【讨论】:

    【解决方案2】:

    这使它成为一个自调用匿名函数。

    (function() { 
        /* function body */ 
    }) /* <-- end of function definition */ (); // <-- invoke that function immediately
    

    【讨论】:

    • 它只是一种标准的javascript语法能够在函数中包装括号并调用该函数吗?我认为我要问的真正问题是括号在 javascript 中是什么以及它可以做什么
    • 第一对括号告诉 JavaScript 将函数定义视为表达式。第二对告诉它调用它。第二对与任何其他函数调用没有什么不同,例如 someFunction(); 它只是看起来很奇怪,因为函数本身是匿名的/没有命名。更多信息:2007-2010.lovemikeg.com/2008/08/17/…
    【解决方案3】:

    没有()(),它有(function(){})()

    函数语法为function(){},函数调用运算符为()。包装函数的括号在技术上并不特殊,您可以将它们替换为!

    !function(){}()
    

    这样做是行不通的:

    function(){}()
    

    因为 this 在语句上下文中,function 开始一个函数声明而不是表达式。然后语法会失败,因为函数声明必须有名称。

    如果我们有!function(){}(或(function(){}),那么它就不可能是一个语句,因为!(或()已经需要一个表达式,所以它将被视为一个表达式。

    所以你可以在没有任何额外的情况下做到这一点:

    var a = function() {
            return false;
    }();
    

    因为var a = 已经在等待一个表达式,所以function 不可能是函数声明的开始。

    检验您的函数是否会被视为表达式或声明的一种简单方法是问自己,我可以在这里使用var x 吗?

    例如:

    var x; //all is fine, so if I said function here, it would be a start of a function declaration
    
    (var x) //Gives an error, so replacing var x with a function would be a function expression
    
    var myVar = var x; //Gives an error, so replacing var x with a function would be a function expression
    

    等等

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 2018-10-26
      • 1970-01-01
      • 2011-08-14
      • 2018-01-26
      • 2015-06-14
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多