递归 回调 迭代 遍历 闭包 区别

 

表示“重复”这个含义的词有不少, 好比循环(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

相关文章
相关标签/搜索