关于javascript:这些双括号在JS中做了什么?

What do these double parentheses do in JS?

本问题已经有最佳答案,请猛点这里访问。

我正在读这本书secrets of the js ninja,而且我经常看到这样的代码

1
2
3
(function(){
  something here;
  })();

为什么我们需要将函数括在括号中?为什么我们之后再添加一对括号?


这个

1
2
3
(function(){
  alert('hello');
})();

虽然它是一个功能,它会自动调用,所以你不能/不能手动调用它

这些对于for循环非常有用

这将失败,因为我将在5秒后等于9

1
2
3
4
5
for(var i = 0; i < 10; i++) {
   window.setTimeout(function(){
      console.log(i);
   }, 5000)
}

所以你可以做到这一点

1
2
3
4
5
6
7
for(var i = 0; i < 10; i++) {
   (function(a){
      window.setTimeout(function(){
         console.log(a);
      }, 5000)
   })(i);
}

也适合创建像这样的"私人"范围

1
2
3
4
5
6
(function(){
   var test = 'hello';
   console.log( test ); // 'hello'
}());

   console.log( test ); // 'undefined'

它是一个自我调用函数,在脚本完成加载时调用它自己。您可以不带参数调用它,也可以向其添加参数,例如windowdocument

你以jQuery使用它的方式使用它:

1
2
3
(function( window, undefined ) {
    // jQuery code
})(window);

一个(几乎)替代语法来做同样的事情:

1
2
3
! function( window, undefined ){
    // some code…
}(window);

欲了解更多信息,请访问:http://sarfraznawaz.wordpress.com/2012/01/26/javascript-self-invoking-functions/


最后一组括号使函数立即执行。无需在任何地方分配功能即可创建和执行功能。可能将代码包装在这样的函数中的原因是封装代码。以此为例:

1
2
var myVar = 'whatever';
function shout() { alert(myVar); }

这里,myVarshout刚刚成为全局变量。您可以打开控制台并键入window.myVarwindow.shout,然后您就可以访问和更改这些变量。通过将其包装在函数中,这些变量保持在外部函数的本地:

1
2
3
4
(function() {
    var myVar = 'whatever';
    function shout() { alert(myVar); }
})();

window.myVarwindow.shout未定义。唯一存在于该函数内部。

该模式还用于创建局部变量周围的闭包。请参阅循环内的JavaScript闭包 - 简单的实际示例。


它运行您刚刚创建的功能。这样做的原因是它包含了您在新范围内编写的所有代码。这意味着当您定义varsfunctions时,它们将保持在您刚刚创建的function()的范围内。

简而言之,它封装了代码。


自我调用功能,基本上它自称是直接的。

通常用于传递像jQuery这样的变量,以确保$是真正的jQuery对象!

1
2
3
(function($){
    // $ now is equal to jQuery
})(jQuery);