回撥函式和遞迴函式的應用
阿新 • • 發佈:2020-06-30
一.回撥函式
意義:回撥函式是一個函式的函式名作為另外一個函式的引數傳入,並且執行
目的:執行完一件事後,自動執行另外一個函式的事情。
舉例1:
function fn(f){ console.log("bbb") //fn1函式名作為fn的引數傳入,並執行 f(); } function fn1(){ console.log("aaa"); } fn(fn1); //執行完列印bbb後,自動執行列印aaa 結果: bbb aaa
舉例2: 面對多個封裝好的函式時,可以自由選擇執行哪一個,不執行哪一個
function fn1(a,b){ return a+b; } function fn2(a,b){ return a*b; } function fn(a,b,fn){ fn(a,b); } var sum=fn(3,5,fn1); var s=fn(3,5,fn2);
console.log(sum,s) 結果: 8 15
舉例3: 函式的互相呼叫
functionfirst(b,c,a){ setTimeout(function(){ console.log("紅燈") b(c,a,b); },1000) } function second(c,a,b){ setTimeout(function(){ console.log("綠燈"); c(a,b,c); },1000) } function third(a,b,c){ setTimeout(function(){ console.log("黃燈"); a(b,c,a); },1000) } first(second,third,first); 結果: 紅燈 綠燈 黃燈 .........
這種使用方法是有些抽象的,如果不是很理解的,可以觀察其中規律,掌握規律後再來研究,方便許多。
二.遞迴函式
什麼是遞迴函式? 遞迴函式說簡單了就是: 函式自己執行自己
作用: 遍歷(適用多層結構)
遞迴有三類:廣度遞迴 深度遞迴 時間複雜度
1.廣度遞迴
var obj = { a: 1, b: 2, c: { a: 3, b: 4, c: { a: 5, b: 6, c: { a: 7, b: 8, c: { a: 9, b: 10 } } } } } function fn1(obj){ for(var prop in obj){ console.log(prop,obj[prop]); if(typeof obj[prop]==="object"){ fn1(obj[prop]); } } } 結果有些長,這裡就不寫了,自己列印吧
列印後很清楚的能看到,廣度遞迴就是一層一層的列印。
2.深度遞迴
深度遞迴分為三種,先序遍歷, 中序遍歷,後序遍歷 ,下面看例子(二叉樹)
function createObj(_value){ var o={}; o.left=null; o.right=null; o.value=_value; return o; } var obj=createObj(1); obj.left=createObj(2); obj.right=createObj(3); obj.left.left=createObj(4); obj.left.right=createObj(5); obj.right.left=createObj(6); obj.right.right=createObj(7);
a.先序遍歷
function showObj(o){ console.log(o.value); if(o.left)showObj(o.left); if(o.right) showObj(o.right); } showObj(obj); 結果是:1234567
b.中序遍歷
function showObj(o){ if(o.left)showObj(o.left); console.log(o.value); if(o.right) showObj(o.right); } showObj(obj); 結果是:4251637
c.後序遍歷
function showObj(o){ if(o.left)showObj(o.left); if(o.right) showObj(o.right); console.log(o.value); } showObj(obj); 結果是:4526731