Javascript 中的回調函數和遞歸函數簡單實際分析學習
1 回調函數
所謂回調函數簡單理解就是將一個函數做爲參數傳遞給其他的函數供其使用。(只是在js中,因爲其它的語言中有指針這個概念)。
舉一個簡單的例子,當我們在統計賬單的時候就要整理材料這些,然後就需要計算器,計算器我們想象成爲一個可以實現計算的函數。統計賬單是另外的另一個函數,當統計賬單的時候就會需要計算器這個函數的支持,其實這就是一個簡單的回調。可以按這個理解。
下來我借用網上的一個例子:
//先定義一個函數fun1 function fun1(num1,num2){ alert(num1+num2); } //再定義一個函數fun2 function fun2(num1,num2,fun){ fun(num1,num2); } //最後調用函數fun2 fun2(3,5,fun1);
結果爲8 過程:當調用fun2函數的時候 傳入了 3 5 fun1 三個參數 傳入的時候就會觸發fun1的函數 以fun在fun2中運行, num1 和num2 爲傳入的 3 5 最後輸出他們的和 8
回調中還有一種匿名的回調
Function fun2 (num1,num2,fun) { Fun(num1,num2); } Fun2 (3,5,function (num1,num2){ alert (num1+num2);});
簡單而言就是將原本在上面提前定義的函數在調用的時候才調用。
另外的一種寫法就是:
(function fun2(num1,num2,fun) { fun(num1,num2); }) (3,5,function(num1,num2) { alert(num1+num2); });
加括號意爲直接就執行。
遞歸函數:
遞歸函數一句話就是:在函數內部直接或間接的調用自己。
瞭解遞歸函數之前需要對堆棧的概念有一定的瞭解。
堆棧:有一句歇後語叫做砌牆的磚頭後來居上。先放下的東西最後拿出來。
設想有一個直徑不大、一端開口一端封閉的竹筒。有若干個寫有編號的小球,小球的直徑比竹筒的直徑略小。現在把不同編號的小球放到竹筒裏面,可以發現一種規律:先放進去的小球只能後拿出來,反之,後放進去的小球能夠先拿出來。所以“先進後出”就是這種結構的特點。
堆棧就是一種數據結構,他是在內存中開闢一個存儲區域,數據一個一個順序的存入(也就是壓入push),有一個地址指針總指向最後一個壓入堆棧的數據所在的數據單元,存放這個地址指針的寄存器就叫做堆棧指示器。開始放入的單元叫做“棧底”。數據一個一個存入的過程叫做壓棧在壓棧的過程中,每有一個數據壓入堆棧,就放在和前一個單元相連的後面一個單元中,堆棧指示器中的地址自動加1。讀取這些數據時,按照堆棧指示器中的地址讀取數據,堆棧指示器中的地址數自動減 1。這個過程叫做“彈出pop”。如此就實現了後進先出的原則
堆棧是計算機中最常用的一種數據結構,比如函數的調用在計算機中是用堆棧實現的。
堆棧可以用數組存儲,也可以用以後會介紹的鏈表存儲。
此處只是做一個簡單的理解。
下來理解遞歸函數:
Function num(num1) { If (num1>1) { Num(--num1); } Document.write(num1) } Num(4);
輸出的結果是1123 ,當運行num函數的時候進入函數體進行判斷,4>1成立,又執行自身的num函數,壓棧3 ,因爲是--num 先自減在使用,依次壓棧爲321,最後由於1不成立直接壓入,最後出棧採用後進先出的規則,所以最後爲1123。
這只是簡單的js回調和遞歸介紹。