2012-08-15 87 views
3

到目前为止,我已经学会了使用此功能的好处(被它包裹?)故障与(函数(){})()

所以,它几乎就像命名空间。 假设我们有:

(function() { 

    function foo(){ 
     alert(true); 
    } 

    foo(); //alerts true 

})(); 


(function() { 

    function foo(){ //the same title of the function as above 
     alert("another call of foo"); 
    } 

    foo(); //alerts, ok. 

})(); 

而且我发现它可以访问公共瓦尔,就像这样:

var __foo__ = 'bar'; 

(function() { 

    alert(__foo__); //alerts bar 

})(); 

我有一个关于这个方法

我已经试过几个问题:

  1. 使用必应的教程(我发现他们,但他们中的许多人不回答我的问题)
  2. 播放与传递对象进入人体
  3. 在这里找到答案

但是,我还是打我的头撞在墙上

所以问题是:

我已经看到人们将对象作为参数传递,但是什么时候才有意义? 例如,这是什么意思?

  1. (function(window) { 
    
    
    })(document); 
    
  2. 我看到水木清华这样的jQuery用户界面库

    (function($) { 
        //some code of widget goes here 
    })(Jquery); 
    

这使得功能外内码可见的,对不对? (不知道)为什么,这是因为 我们可以访问对象(比如我们有“模式”窗口小部件),只需调用它,

,如:

$(function(){ 

    $("#some_div").modal(); //here it's object the we got from the function 
}); 

而第二个问题是:如何它工作吗?

+0

有什么问题吗?正如标题所示,您是否遇到了“(function(){})()'的实现问题?或者你只是问它如何工作以及何时使用它? – MrOBrian 2012-08-15 19:01:24

+0

@MrOBrian那么,我有这两个问题。 – Yang 2012-08-15 19:02:32

回答

1

主要有2个目的通过在窗口和下方观察

(function(window, document){ 
    // code 
}(window, document); 
  1. 的JavaScript可以更快地访问本地变量比全局变量的文档对象,。这种模式实际上使局部变量名称为windowdocument而不是全局变量,从而使脚本稍快。
  2. 使这些名称局部变量有另一个好处:缩小器可以重命名它们。因此,如果您缩小上述脚本,则window的本地版本可能会重命名为a,并且document可能会重命名为b,从而缩小缩小的脚本。如果您将它们作为全局变量引用,则这些重命名是不可能的,因为这会破坏您的脚本。

欲了解更多信息,结帐这些真棒视频

  1. http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/
  2. http://paulirish.com/2011/11-more-things-i-learned-from-the-jquery-source/
2

我见过人们将对象作为参数传递,但是什么时候才有意义?例如,这是什么意思?

(function(window) { 
})(document); 

不治疗参数的语言立刻打电话功能不同于参数等功能。

只要您希望在函数体中为本地名称输入一个参数,就可以使用参数。在这种情况下,有点令人困惑,因为windowdocument可能会被混淆。


(function($) { 
    //some code of widget goes here 
})(Jquery); 

这使得内码的功能外可见的,对不对?(不知道)为什么,这是因为我们可以访问对象(说我们有“模态”窗口小部件),只需调用它,

不,它本身没有任何代码部件外部可见。这只是一个参数定义,它为全局变量提供了一个新的局部名称&。

什么使内码可见外侧将其连接到外部物体如

$.exportedProperty = localVariable; 

这在jQuery代码共同约定。

1

关于第一个问题,我不认为你看到的窗口和文档,但更多的东西一样:用像任何函数参数

(function(doc) { 
    var fubar = doc.getElementById("fubar"); // === document.getElementById("fubar") 
})(document); 

你有一个自我调用函数(或关闭):

var b = function(str) { alert(str); } 
b('hi there') //alert('hi there'); 

与上面的代码一样,但我们只是一次调用该方法,我们创建它。

其他代码,您有:

(function($) { 
    //some code of widget goes here 
})(Jquery); 

是预留梅托德来引用jQuery对象内部的$变量,这是非常方便的,如果你有更多的框架或用别的东西代替了$对象,该方法中的所有内容都将使用$来引用jQuery对象,而不是其他任何东西(如果不在代码中替换它)。

代码:

$(function(){ 
    $("#some_div").modal(); //here it's object the we got from the function 
}); 

呼吁jQuery和其$(document).ready

一个快捷方式,它会调用该方法:尽快

function(){ 
    $("#some_div").modal(); //here it's object the we got from the function 
} 

为DOM就绪

1

该模式被称为封闭。这是有道理的,当一个模块或功能的使用方法:

  1. 要避免污染全局作用域变量
  2. 要避免使用全局作用域的变量,并避免其他代码污染他们

对于例如,每个的,第一借此图案:

封闭内部
(function(window) { 
    // ... 
})(window); 

一切都将能够使用窗口就好像它是一个局部变量。

接下来,使用jQuery符号采取相同的模式:

(function($) { 
    // ... 
})($); 

如果你有一些代码依赖于像$符号/命名空间,而是另一种模块重新分配的是,它可以搞砸了你的代码。通过允许您将符号注入闭包,使用此模式避免了这种情况。

1

无论何时将参数传递给该包装函数,都不会让您的应用程序中可能存在的任何其他库或全局变量搞砸。

例如,你可能知道jQuery使用$为自称的象征,你也可能有另一个库,也将使用$调用itselt,在此条件下,你可能会遇到麻烦引用您的库。所以你会解决这个问题是这样的:

(function($){ 
// here you're accessing jQuery's functions 
$('#anything').css('color','red'); 
})(jQuery); 

(function($){ 
    // and in here you would be accessing the other library 
    $.('#anything').method(); 
})(otherLibrary); 

这时候你正在做的jQuery或任何其他类型库的插件是特别有用的。

1

它的功能是允许您在函数中使用$变量代替jQuery变量,即使$变量被定义为函数外的其他内容。

举个例子,如果您同时使用jQuery和原型,你可以使用jQuery.noConflict()确保原型的$仍然在全局命名空间访问,但你自己的函数里面,你可以使用$指jQuery的。