2012-11-14 139 views
0

我試圖建立一個Javascript庫,將提供一些功能,我正在放在一起的JQuery插件。Javascript庫快速入門

我從網上搜索了下面的框架代碼,雖然我不太清楚它是如何工作的(我知道它是一個閉包)。我已經通過聲明添加了我的函數。

(function(window, document, $) { 

    function func_1(){ 
     return 1; 
    } 

    function func_2(){ 
     return 2; 
    } 

})(window, document, jQuery); 

所以我把上面的代碼在一個單獨的JS文件,然後採購它在我的HTML頁面,然後我跑嘗試運行的功能,像這樣(注:我有JQuery的設置以及):

<script type="text/javascript"> 
     $(document).ready(function() { 
      console.log(func_1()); 
     }); 
</script> 

但是,我似乎在Firebug(ReferenceError: func_1 is not defined)中得到一些錯誤。

我有兩個問題:

  1. 我怎麼叫我的功能?
  2. 我希望能夠以下列格式調用函數:className.functionName()。我如何重構框架代碼,使我能夠做到這一點,並說,像這樣調用我的功能:Device.func_1()

感謝您的期望幫助。

回答

2

閉包用於隱藏其餘代碼的內部函數。你需要明確揭露圖書館的公共職能:

var Device = (function(window, document, $) { 
    function func_1(){ 
     return 1; 
    } 

    function func_2(){ 
     return 2; 
    } 

    var internalDevice = { 
     func_1: func_1, 
     func_2: func_2 
    }; 
    return internalDevice; // expose functionality to the rest of the code 
})(window, document, jQuery); 

(function(window, document, $) {})(window, document, jQuery);部分被稱爲立即調用的函數表達式(IIFE)。它用於避免將所有庫函數泄漏到全局範圍中。否則,如果某個其他庫具有func_1函數,它將被覆蓋或覆蓋您的庫func_1

該函數的參數用於控制庫如何影響代碼的其他部分並依賴它。例如,某人可能會覆蓋該窗口。$ library,這樣$在代碼中的任何地方都不再可用。但既然你在封閉中有一個本地引用,你仍然可以訪問它。

或者使用上面的代碼 - 返回一個對象 - 您也可以直接給您的圖書館向全球範圍:

(function(window, document, $) { 
    ... 
    window.Device = internalDevice; // expose functionality to the rest of the code 
})(window, document, jQuery); 
+0

非常感謝!這正是我需要的。乾杯。 –

0

我只能回答問題二號,但您可以創建,通過這樣做:

var Device = { 
function func_1() 
{ 
// your first function 
}, 
function func_2() 
{ 
// your second function 
} 
}; 

這樣,你可以只要致電:

Device.func_1(); 

合幫助:)

0

當事情是瓶蓋內它的範圍變更爲關閉。 func_1func_2只能在調用它們的匿名函數內部和下面看到。