JavaScript闭包的理解

2016-09-11  本文已影响0人  尹萨萨

闭包是指一个函数可以调用其他函数的变量。最常见的闭包就是一个函数嵌套另一个函数;

闭包的最大用处有两个:

参考资料

参考资料

要想达到目的需要做的是创建闭包,且创建时定义域内含有闭包使用的变量,即可将变量储存下来

    var fnArr = [];
    for (var i = 0; i < 10; i ++) {
      (function(n){
        fnArr[i] =  function(){
            return n;
            }
        }(i));
      }
    console.log( fnArr[3]() )
   var fnArr = [];
    for (var i = 0; i < 10; i ++) {
      (function(){
         var n=i;
        fnArr[i] =  function(){
            return n;
          }
      }());
      }
    console.log( fnArr[3]() )
   var fnArr = [];
    for (var i = 0; i < 10; i ++) {
        fnArr[i] =  (function(){
            var n=i;
            return function(){
              return n;
            }}());         
      }
    console.log( fnArr[3]() )
    function testCar(){
    var speed = 0;
    function setSpeed(n){
        speed = n;
    }
    function getSpeed(){
        console.log(speed);
        return speed;
    }
    function accelerate(){
        speed += 10;
    }
    function decelerate(){
        speed -= 10;
    }
    function getStatus(){
        if(speed > 0){
            console.log("running");
        }else{
            console.log("stop");
        }
    }
    return {
        setSpeed:setSpeed,
        getSpeed:getSpeed,
        accelerate:accelerate,
        decelerate:decelerate,
        getStatus:getStatus
    }
  }
    var Car = testCar();
    Car.setSpeed(30);
    Car.getSpeed(); //30
    Car.accelerate();
    Car.getSpeed(); //40;
    Car.decelerate();
    Car.decelerate();
    Car.getSpeed(); //20
    Car.getStatus(); // 'running';
    Car.decelerate();
    Car.decelerate();
    Car.getStatus();  //'stop';
      var i=0;
    function setInt(){
      setTimeout(function(){  ;
    
        console.log( i++)
        setInt();
      },1000);
    }  
    setInt()
function time(){
        var i=0;
        var bg = Date.now()
        var p = setTimeout(function(){
          i++;
          if(i===1000){
            clearTimeout(p);
            var be=Date.now();
            console.log((be-bg)/i);            
          }
          p=setTimeout(arguments.callee,0)  
      },0)}
      time()
    var a = 1;
    setTimeout(function(){ //最后执行
    a = 2;
    console.log(a); //2
    }, 0);
    var a ;
    console.log(a); //1
    a = 3;
    console.log(a); //3

由于setTimeout让次函数最好执行,所以结果依次为,1,3,2


var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
var flag = true;  
while(flag){}         //此处形成死循环,所以无法输出值
console.log(flag);
setTimeout(function(){  // 由于setTimeout(fun,0)的特性,相关函数最后执行
flag = false;
},0)
      for(var i=0;i<5;i++){
        (function(){
          var n=i
          setTimeout(function(){
               console.log('delayer:' + n );
          }, 0);
        }(i));
    console.log(i);
    }
上一篇 下一篇

猜你喜欢

热点阅读