2009-12-06 71 views

回答

3

以函數爲參數的函數稱爲高階函數。谷歌有很多關於這些的信息。的高階函數

例子:

function compose(f, g) { 
    return function(x) { 
    return f(g(x)); 
    }; 
} 

function map(f, xs) { 
    var ys = []; 
    for(var i = 0; i < xs.length; ++i) 
    ys.push(f(xs[i])); 
    return ys; 
} 

有了這一點,你可以在一排兩個函數變換數組:

var a = ["one", "two", "three"]; 
var b = map(compose(toUpperCase, reverse), a); 
// b is now ["ENO", "OWT", "EERHT"] 
1

1例是一個javascript AJAX調用

namespace.class.method(parm1, parm2, callback,onErr); 

該方法將在服務器上asynchrously運行,一旦完成,它將運行其傳遞

function callback(result) { 
     $('#myDiv').innerHTML = result; 
} 

有回調方法許多其他的例子,只是以事件處理爲例。

4

如果你有很多動作的知識,你可能會使用一個這個例子始終沒有注意到。

EventDispatcher類實際上需要一個函數傳遞到它的addEventListener時,它被稱爲:

的addEventListener(類型:字符串, 聽衆:功能的方法,useCapture:布爾 = false時,優先級:INT = 0,將useWeakReference:布爾= FALSE):無效

http://livedocs.adobe.com/flex/3/langref/flash/events/EventDispatcher.html

周圍傳遞函數被用於很多用於地獄回調。還有很多其他用途,但這突出了一個更簡單的場景。

4

性能開銷並不比在任何當代面嚮對象語言中調用虛擬方法都差。

當程序變得更小時,將過程傳遞給其他過程是有意義的。較少的代碼具有較少的錯誤並且易於維護。這是一個例子。這是兩個函數分別對數字列表和多個數字列表進行求和。

他們除了運營商+-和相應的標識值(01)相同。我們遺憾地重複了很多代碼。

我們可以通過抽象運算符和標識來降低複雜性。重寫的代碼看起來像這樣。

(define fold 
    (lambda (proc id) 
     (lambda (ls) 
     (if (null? ls) 
      id 
      (proc (car ls) (fold (cdr ls) proc id)))))) 

    (define sum (fold + 0)) 
    (define product (fold * 1)) 

現在更容易看到sumproduct之間的本質區別。此外,核心代碼的改進只需要在一個地方完成。程序抽象是一個神話般的工具,它依賴於能夠將程序傳遞給其他程序。

1

將函數傳遞給函數的另一個原因是,如果您希望接收函數在它所做的工作中具有靈活性,例如我有一個遞歸函數來處理目錄樹,提供的函數並將其傳遞到當前目錄。這樣我可以使用相同的結構來掃描目錄,複製目錄或刪除目錄。而「工作」功能必須足夠複雜才能處理一個目錄而不是一棵樹。這主要是使用面向對象的程序編程,有優先的方式來做到這一點,繼承,委託等。

0

另一個很常見的例子是排序你傳遞謂詞的位置,即如何排序

(sort>的列表來排序)

這裏>是應用,而排序的功能。這是一個非常簡單的例子,它使用大於等於你的列表必須是數字,但它可以是任何例如

(排序(拉姆達(AB)(>(字符串長度的)(字符串長度b)))列表至排序)

在這裏的封閉被傳遞的是比在字符串比較確實更大長度假定列表包含字符串。

這些類型的東西只是吸引語言沒有閉包或HOFs,因爲所有的對象/接口/類型的廢話,需要實現相同。

相關問題