2010-03-10 34 views
5

爲jQuery插件創建靜態變量的最佳方式是什麼?靜態變量一個jQuery插件;如何創建?

我有2個示例用例來說明我目前的想法;每個人都有一些想法。
任何其他的想法當然歡迎...

一個例子是爲一個靜態變量包含:動畫設置,佈局設置,產品詳細信息等;另一個用於靜態變量緩存數據。

我希望'靜態'是在這裏的正確terminolgy ...單一全局。如果錯誤請糾正。

案例1:設置

// defining globally 
var anObject = { 
value1 = 0; 
value2 = 0; 
} 

jQuery.anObjectSet(partialObject) { 
anObject = jQuery.extend(anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
obj = jQuery.extend(anObject, partialObject); 
} 

或可能?

// adding to the jQuery object 
jQuery.anObject = { 
value1 = 0; 
value2 = 0; 
} 

jQuery.anObjectSet(partialObject) { 
jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
obj = jQuery.extend(jQuery.anObject, partialObject); 
} 

或者可能嗎?

jQuery.anObjectSet(partialObject) { 
if(!jQuery.anObject) 
    jQuery.anObject = { 
    value1 = 0; 
    value2 = 0; 
    } 

jQuery.anObject = jQuery.extend(jQuery.anObject, partialObject); 
} 

jQuery.fn.myPlugin = function (partialObject) { 
if(!jQuery.anObject) 
    jQuery.anObject = { 
    value1 = 0; 
    value2 = 0; 
    } 
obj = jQuery.extend(jQuery.anObject, partialObject); 
} 

案例2:緩存

jQuery.fn.myPlugin = function (newObject) { 
if(!cache[newObject]) 
    cache[newObject] = $(newObject); 

return cache[newObject]; 
} 

或可能? (我在別處見過這種方法)

window.$cache = {}; 

jQuery.fn.myPlugin = function (newObject) { 
if(!$cache[newObject]) 
    $cache[newObject] = $(newObject); 

return $cache[newObject]; 
} 

謝謝。我想建立一個.js庫,開始正確的軌道...

回答

11

如果你正在尋找一個「全局」或靜態變量爲你的圖書館和你的圖書館,封閉是方式走。

一個普通的全局是一件壞事,因爲它污染了命名空間,而且你不知道誰將運行你的庫。

通過在匿名函數中定義靜態變量,我們讓自己訪問一個變量,任何人都無法觸及並且對我們的函數來說是有效的「全局」變量。如果我正確理解你正在嘗試做什麼,這應該完成它。

(function($){ 
    var $cache = {}; 

    jQuery.fn.myPlugin = function (newObject) { 
     if(!$cache[newObject]) 
     $cache[newObject] = $(newObject); 

     return $cache[newObject]; 
    } 

})(jQuery); 

編輯:

$cache變量,就只有這個匿名函數中定義的函數訪問。所以如果其他函數需要訪問這個文件,它們也必須在這個匿名函數中定義。

在這裏定義所有東西(AFAIK)的唯一選擇是存取函數的一些組合,在這個閉包中定義一個簡單的函數,其目的是提供外部函數訪問$cache

最好,我會去定義這個閉包內的必要函數。但是,這最終是一個實施細節,並且由您自行決定。

+1

ps,有一個「插件開發」部分@ http://docs.jquery。com/Tutorials,如果你想閱讀更多:-) – Seaux 2010-03-10 20:18:39

+0

這是很好的〜一個問題:我在別處使用這種技術創建另一個插件。它包裹在上面推薦的匿名函數中。它會訪問$緩存嗎?或者插件的函數是否需要包含在同一個匿名函數中?去測試... – Ross 2010-03-10 20:34:25

+0

@Danny感謝您的編輯。輝煌。如果只有可能,再次+1。 – Ross 2010-03-11 14:16:52

相關問題