遞歸 回調 迭代 遍歷 閉包 區別

 

表示「重複」這個含義的詞有不少, 好比循環(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

相關文章
相關標籤/搜索