2012-07-27 54 views
0

我有一個基於apache的web應用程序。 PHP,JS和jQuery。一切正常。JS中運行時上下文模式的最佳實踐

在客戶端,JS/jquery中有一個小型庫,提供了一些通用的列表處理方法。在過去,我使用回調來處理這些方法必須略有不同的幾個問題。這樣我可以重複使用列表處理,對話框處理和應用程序的不同部分的東西。然而,最近我進入圖書館時不得不通過的回調數量越來越多,我正在嘗試重新設計:

我沒有將所有回調指定爲函數參數,而是在庫中創建了一箇中央目錄對象。初始化時,應用程序的每個模塊都將自己的回調變體註冊到該目錄中。在運行時,這些方法在該目錄中查找所需的回調,而不是期望在其參數列表中指定它。這清理了很多事情。

但是我還有一件事情我仍然無法擺脫:我需要一個單一的參數(我稱之爲上下文,模式可能是另一個術語),這些方法用於查找目錄中所需的回調。這種情況必須交給所有方法。肯定比各種不同的回調都好,但我想知道是否可以擺脫最後一個。 但我在哪裏指定該上下文,如果不是方法參數?我對JS和jquery很新,所以我沒有找到解決方法。顯然我不想使用全局變量,坦率地說,我懷疑我可以簡單地將一個上下文存儲在單個變量中,因爲所有事件處理程序和外部影響方法可能會在不同的上下文中被調用時間,或至少交錯。所以我想我需要更接近功能堆棧的東西。也許我可以簡單地將一個上下文對象推送到堆棧,並從庫中需要知道的層中讀取它?當我離開圖書館時,該對象將被刪除。當然也有其他方法。

在這裏有如此多的有經驗的編程人員可以給一個新手提供一個簡短的提示,這是一個可以產生想法的起點,以及如何實現它。這種「通常」是如何完成的?


我試了一會,探索arguments.callee.caller層次結構。我想也許我可以在一個調用函數中設置一個原型成員,然後,當執行進一步下去時,我可以簡單地向上遍歷調用堆棧,直到找到一個調用者持有這樣的屬性並將該值用作上下文。 但是我也看到了正在進行的討論,它揭示了兩件事:1.)arguments.callee似乎被折舊,並且2.)它看起來非常昂貴。所以這是不行的。

我也看了一下Function.caller替代(這似乎被貶值,更有效,但是到現在爲止我沒有探索蹤跡......


目前書面傳遞context/mode down只是簡單的在函數調用中指定一個附加參數,它帶有一個唯一的字符串,在查詢目錄的時候用作關鍵字,所以像這樣(不能複製,但是寫成原始的例子):

<!-- callbacks --> 
callback_inner_task_base:function(arg1,arg2){ 
    // do something with args 
} 
callback_inner_task_spec:function(arg1,arg2){ 
    // do something with args 
} 

<!-- catalog --> 
Catalog.Callback:function(context,slot){ 
    // some plausibility checks... 
    return Catalog[context][slot]; 
} 
Catalog.base.slot=callback_inner_task_base; 
Catalog.spec.slot=callback_inner_task_spec; 

<!-- callee --> 
do_something:function(arg1,arg2,context){ 
    ... 
    // callback as taken from the catalog 
    Catalog.Callback(callback,'inner_task')(arg1,arg2); 
    ... 
} 

<!-- caller --> 
init:function(...){ 
    ... 
    do_something('thing-1',thing-2','base'); 
    do_something('thing-1',thing-2','spec'); 
    ... 
} 
+1

你有代碼的一個小例子嗎? – elmuchacho 2012-07-27 22:22:05

+0

@elmuchacho嗯,這並不容易。這個東西是開源的,但是簡單地給你代碼庫的URL將無濟於事,代碼遍佈在太多的文件中。我不明白我能如何輕鬆地過濾出一個小而有意義的例子......這就是爲什麼我試圖以更爲描述的方式提出問題,試圖將事物放在一個普通的形狀中。有沒有什麼特別的細節你想看看? – arkascha 2012-07-28 04:35:01

+0

@arkascha然後顯示一個例子,說明在一個簡單情況下這個上下文是如何傳遞的? – 2012-07-28 09:26:28

回答

1

但是我在哪裏指定該上下文,如果不是方法參數?

  • 使用的功能特性,如Catalog.Callback.context
  • 使用monad