JavaScript基礎(六)回調函數與遞歸函數

直接進入正題,簡單的說說JavaScript的回調函數與遞歸函數。 函數

一、回調函數  spa

    所謂的回調函數就是指將一個函數的指針(地址),也就是JavaScript中函數的函數名(JavaScript沒有像C那樣的指針)做爲參數傳遞給另外一個函數,當在調用這個參數時,就是調用這個參數指向的函數,這就是回調函數。我就用生活中的一個例子來反映個人理解:在商場中有寄放物品的小櫃子,我將其中一個小櫃子的編號(前提是小櫃子沒鎖)給你,你在作某件事的時候須要用小櫃子裏的東西,你再根據編號去取出來使用。JavaScript中回調函數通常在特定的事件觸發後再調用,用來處理這個事件。意思就是本身定義的函數可是由他人去調用執行。 指針

再來講說回調函數的傳遞方法:          遞歸

首先最容易看懂的方法是:
先定義一個函數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);調用fun2函數,並傳遞三個參數,而函數fun1就被做爲參數傳遞給了函數fun2,接下來繼續在fun2的函數體內調用了fun,即被做爲參數傳遞過去的fun1函數,輸出結果爲8。 ip

接下來是一種匿名方式傳遞函數: 回調函數

即不用先定義函數,直接在參數傳遞的時候定義函數
首先也是定義一個函數fun2
function fun2(num1,num2,fun){
  fun(num1,num2);
}
在這裏咱們沒有和上面同樣定義函數fun1了,而是直接將定義和調用函數fun2放在了一塊兒,將函數體傳遞給fun2
fun2(3,5,function(num1,num2){
 alert(num1+num2);
}); it

上面的輸出結果同樣爲8,只是此次不是將函數名傳遞過去,二是直接將函數體做爲參數傳遞給函數fun2。 io

上面兩種方法繼續用商場儲物櫃來解釋:第一種方法比如我只將小櫃子的號碼告訴了你,你要用裏面的東西還要本身去取,而第二種方法則是我直接將小櫃子裏面的東西給你,你不用再親自到小櫃子裏面去取。固然這只是我爲了記住上面兩種方法的區別而作的比喻,在計算機執行並時 我也不知道是否是這樣。 function

還有一種方法就是定義的同時也在調用:

(function fun2(num1,num2,fun){
   fun(num1,num2);
})(3,5,function(num1,num2){
                      alert(num1+num2);   
});

上面的結果一樣爲8,我在fun2函數外面打上括號表示當即執行,上面的方法其實就是下面這種形式的簡寫

function fun2(num1,num2,fun){    
           fun(num1,num2);
}
fun2(3,5,function(num1,num2){        
             alert(num1+num2);
});

 

遞歸函數:

在函數內部直接或間接的調用本身。

先來一段簡單的代碼

function num(num1){
    if(num1>1){ 
       num(--num1);
    
    document.write(num1)
}
num(4);

上面最終的輸出結果是1123,爲何會是1123呢,這就要說道堆棧的原理,先進後出,上述條件每成立一次,就進行一次,因爲是--num,因此一次壓棧是321,最後num1=1時條件不成立,因此就直接壓入1,最後出棧後進先出,因此是1123。

再來一個求階乘的例子,5的階乘5!=5*4*3*2*1,咱們能夠寫成
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
1!=1
那麼就能夠用遞歸的方式來實現

 

function factorial(num) {
   if(num==1){
     return num;
   }else{
     return num*factorial(--num)
   }
}
alert(factorial(5));
結果爲120,咱們來看看具體的執行過程:首先進入函數體後判斷條件,不成立,返回調用本身自己的結果,而且在調用以前自減1,當num==1條件不成立時,函數就會一直返回調用本身自己,直到num==1條件成立時,返回1,再依次往外層返回結果,最後造成:
5!=5*4!
4!=4*3!
3!=3*2!
2!=2*1!
1!=1
的類型,最終輸出120。

最後JavaSript的回調函數和遞歸函數並非這麼簡單,這只是一個簡單的介紹,要運用好回調和遞歸還須要往後勤加練習。

相關文章
相關標籤/搜索