@IT·互联网

JavaScript的闭包

2017-04-23  本文已影响0人  柏龙

什么是闭包?

闭包是指有权限访问另一个函数作用域的变量的函数,创建闭包的常见方式就是在一个函数内部创建另一个函数,并返回当前函数作用域的变量,暴露出变量,让别人可以访问。

实例代码:

function foo(){
    var local = 1;
    function bar(){
        local++;
        return local;
    }
    return bar;
}
var func = foo();
func(); // 2

下面的代码输出多少?修改代码让 fnArr[i]() 输出 i

var fnArr = [];
for (var i = 0; i < 10; i++) {
    fnArr[i] = function(){
        console.log(i);
    }
}
console.log( fnArr[3]() ); // 输出 10

方法一:

var fnArr = [];
for (var i = 0; i < 10; i++) {
    (function(j){
        fnArr[i] = function(){
            console.log(j);
        }
    })(i)
}
console.log( fnArr[3]() ); // 输出 3

方法二:

var fnArr = [];
for (var i = 0; i < 10; i++) {
    fnArr[i] = (function(){
        var j = i;
        return function(){
            console.log(j);
        }
    })()
}

console.log( fnArr[7]() ); // 输出 7

封装一个汽车对象,可以通过如下方式获取汽车状态

var Car = (function(){
   var speed = 0;
   function setSpeed(s){
       speed = s;
   }
   function getSpeed(){
        return speed;
   }
   function accelerate(){
        return speed += 10;
   }
   function decelerate(){
        return speed = parseInt(speed) > 0 ? speed - 10 : 0;
   }
   function getStatus(){
        return speed = speed > 0 ? 'running' : 'stop';
   }
   return {
      setSpeed: setSpeed,
      getSpeed: getSpeed,
      accelerate: accelerate,
      decelerate: decelerate,
      getStatus: getStatus,
      speed: 'error'
   }
})();
Car.setSpeed(30);
Car.getSpeed();     // 30
Car.accelerate();   // 40
Car.getSpeed();     // 40
Car.decelerate();   // 30
Car.decelerate();   // 20
Car.getSpeed();     // 20
Car.getStatus();    // 'running';
Car.decelerate();   // 0
Car.decelerate();   // 0
Car.getStatus();    // 'stop';
Car.speed;          // error
上一篇下一篇

猜你喜欢

热点阅读