表示「重複」這個含義的詞有不少, 好比循環(loop), 遞歸(recursion), 遍歷(traversal), 迭代(iterate).
循環算是最基礎的概念, 凡是重複執行一段代碼, 均可以稱之爲循環. 大部分的遞歸, 遍歷, 迭代, 都是循環.算法
遞歸是重複調用函數自身實現循環。編程
迭代是函數內某段代碼實現循環,而迭代與普通循環的區別是:循環代碼中參與運算的變量同時是保存結果的變量,當前保存的結果做爲下一次循環計算的初始值。網絡
迭代,重複必定的算法,達到想要的目的。數學上二分法,牛頓法是很好的迭代例子閉包
function iteration(x){ var sum=1; for(x; x>=1; x--){ sum = sum*x; } }
迭代式開發:迭代式開發應該是取自"迭代(數學)"的概念的, 意思是把開發過程劃分紅若干個小目標, 對每一個小目標單獨進行設計, 開發, 測試, 逐步地完成整個項目. 而傳統的開發過程是純線性的, 先統一設計, 再統一編碼, 再統一測試. 相比於傳統開發過程, 迭代式開發更靈活, 可以適應需求的變動, 及時驗證設計的可行性等等的...dom
迭代開發更接近循環的意思,是指屢次按照開發,測試,發佈這樣的週期循環來完成一個軟件產品的最終發佈。而不是試圖一次性完成全部工做,發佈最終版本函數
定義:把函數當作參數傳遞到另外一個函數內部去調用,就叫回調。oop
應用場景:用於導航欄,當咱們點擊連接是纔開始加載資源,避免同時加載多個資源,佔用大量空間形成卡頓。測試
舉例:this
function request(fn){//這裏的fn就至關於showCar、showWomen console.log("發送網絡請求"); setTimeout(function(){ console.log("獲得請求數據"); fn();//至關於showCar();、showWomen(); },(Math.random()*3+1)*1000); } function showWomen(){ console.log("把女人展現在HTML上"); } function showCar(){ console.log("把汽車展現在HTML上"); } request(showWomen); request(showCar);
結果以下:編碼
定義:在函數的內部調用自身就是遞歸。
應用場景:快速排序。
舉例:①打印數字1~10;
var i =10; function test(){ var a = i--; if(i<0){ return; } test(); console.log(a);//結果爲2~10 } test();
②實現1~n的累加:
function add(num){ if(num<=1){ return 1; } return num+add(num - 1); } var res = add(100); console.log(res);
注意:區分回調和遞歸,回調是一個函數把自身外部的函數當作參數傳遞到自身內部來調用;而遞歸是本身調用本身。
總結:函數內部定義函數----閉包
函數內部調用其餘函數----函數調用
函數內部調用參數傳過來的函數----回調函數
函數內部調用本身這個函數----遞歸
循環(loop) - 最基礎的概念, 全部重複的行爲
遞歸(recursion) - 在函數內調用自身, 將複雜狀況逐步轉化成基本狀況
(數學)迭代(iterate) - 在屢次循環中逐步接近結果
(編程)迭代(iterate) - 按順序訪問線性結構中的每一項
遍歷(traversal) - 按規則訪問非線性結構中的每一項
這些概念都表示「重複」的含義, 彼此互相交叉,
閉包 : 有權訪問另外一個函數做用域中的變量的函數(定義在一個函數內部的函數)
function add(num1,num2){ return function doAdd(){ return num1+num2; }; } var r = add(1,2); var result = r(); alert(result); //或者調用方式以下 var result = add(1,2)(); alert(result);
/*****************************/
function test(){
var i = 100;
function t(){
alert(i);
function t2(){
alert("disanceng");
}
return t2;
}
i++;
return t;
}
test()()(); //這樣調用才使得內層函數執行, 注意若是函數內 return t2(); return t(); 那麼執行 test();就能夠了.
/***** 閉包案例 ********/
var name = 10;
var obj = {
name:"hello",
fn:function(){
return function(){
retrun this.name;
}
}
};
alert(obj.fn()()); //結果是10, 由於閉包內的 this 是全局 window 的,若想調用obj.name 下面這個案例
var name1 = 10;
var obj1 = {
name : "obj-name",
fn : function(){
var t = this;
return function(){
retrun t.name;
}
}
};
alert(obj1.fn()()); //結果就是 obj-name