9

我在看书secrets of the js ninja,经常看到这样的代码

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

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

4

5 回答 5

5

它是一个自调用函数,在脚本完成加载时调用它的自身。您可以不带参数调用它,也可以向它添加参数,例如windowor document

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

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

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

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

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

于 2013-07-13T20:07:23.360 回答
5

这个

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

虽然它是一个函数,但它是自动调用的,所以你不能/不能手动调用它

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

这将失败,因为 5 秒后 i 将等于 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'
于 2013-07-13T20:07:41.083 回答
3

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

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

到这里,myVarshout刚刚变成了全局变量。您可以打开控制台并输入window.myVaror window.shout,您将能够访问和更改这些变量。通过将其包装在一个函数中,这些变量对于外部函数仍然是本地的:

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

window.myVar并且window.shout是未定义的。唯一存在于该函数内部。

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

于 2013-07-13T20:12:49.717 回答
0

自调用函数,基本上是直接调用自己。

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

(function($){
    // $ now is equal to jQuery
})(jQuery);
于 2013-07-13T20:06:52.497 回答
0

它运行您刚刚创建的函数。这样做的原因是它将您编写的所有代码都包含在一个新的范围内。这意味着当您定义varsand时functions,它们将保持在function()您刚刚创建的范围内。

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

于 2013-07-13T20:07:50.463 回答