2010-09-28 53 views
1

這是什麼封閉是要避免的,但我想知道是否有方法來添加一個方法到閉包。基本上我有一個js文件庫,我想通過添加一個新的方法來增加特定的客戶端。我可以添加一個方法到封閉

我有一個名爲庫js文件:

var LIBRARY = (function(){ 
var name; 
return { 
setName: function(n) { name = n; } 
}()); 

但對於新客戶,我想給他們一個新的js文件,該文件將只增加庫,添加新的功能:

function(first, last){ 
name = first + " " + last; 
} 

雖然我不想修改庫js。有沒有辦法將這個函數追加到LIBRARY中,以便該函數有必要訪問名稱變量?

回答

0

所以我只是想離開就如何我竟然做到了這一點,因爲它強調在思考建築的不同方式的說明JS。

如前所述,我希望能夠通過客戶端特定功能擴充我的庫。我落得這樣做修改我的圖書館看書是這樣的:

var LIBRARY = (function(){ 
var name; 
var settings; 
return { 
    init: function(options){ 
    jQuery.extend(settings, options); // just merges two objects together 
    } 
    setName: function(n) { name = n; } 
    custom: function(){ 
    if (!settings.custom || typeof(settings.custom == 'function')) 
     return; 
    name = settings.custom.apply(this, arguments); 
    } 
}()); 

然後,客戶機庫增強了我的圖書館,象這樣一個功能:

LIBRARY.init({ custom: function(first, last) { 
return first + " " + last; 
} }); 

所以現在客戶端代碼可以撥打:

LIBRARY.custom("static", "hippo"); 

將被設置爲「靜態河馬」

1

不,不幸的是,您不能  —或至少,不是在一個合理的方式。只有在該閉包中定義的函數才能訪問該局部變量。

不合理的做法是用eval玩遊戲,但我強烈建議不要這樣做。

您只需將功能添加到LIBRARY即可,不需要直接訪問該變量。

0

不知道你究竟是如何設想的「追加」,但這部作品

// Base 
var LIBRARY = (function(){ 
    var name; 
    return { 
     setName: function(n) { name = n; } 
    , getName: function() { return name; } 
    } 
}()); 

// Extension 
LIBRARY.setFullName = function(first, last) 
{ 
    this.setName(first + " " + last); 
} 

// Test 
LIBRARY.setFullName('Peter', 'Bailey'); 
alert(LIBRARY.getName()); 
+0

我是河濱g能夠直接進入而不暴露name變量(雖然setName只暴露了一個setter,但這不是個好主意)。可能不得不走這條路線 – hackerhasid 2010-09-28 17:07:56

+0

@statichippo:這真的是你唯一的選擇,禁止(再次)使用'eval',這只是一個蠕蟲罐。 – 2010-09-28 17:10:59

+0

我甚至沒有考慮評估路徑。 eval離邪惡只有一個字母;) – hackerhasid 2010-10-04 00:50:29

相關問題