这些双括号在JS中做了什么?

时间:2013-07-13 20:05:40

标签: javascript

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

(function(){
  something here;
  })();

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

5 个答案:

答案 0 :(得分:4)

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

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

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

执行相同操作的(几乎)替代语法:

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

阅读详情:http://sarfraznawaz.wordpress.com/2012/01/26/javascript-self-invoking-functions/

答案 1 :(得分:4)

这个

(function(){
  alert('hello');
})();

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

这些对于像这样的for循环非常有用

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

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

所以你可以这样做

for(var i = 0; i < 10; i++) {
   (function(a){
      window.setTimeout(function(){
         console.log(a);
      }, 5000)
   })(i);
}

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

(function(){
   var test = 'hello';
   console.log( test ); // 'hello'
}());

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

答案 2 :(得分:2)

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

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

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

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

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

该模式还用于创建局部变量周围的闭包。请参阅JavaScript closure inside loops – simple practical example

答案 3 :(得分:0)

自我调用功能,基本上它会自行调用。

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

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

答案 4 :(得分:0)

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

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