JavaScript的闭包

作者: 柏龙 | 来源:发表于2017-04-23 00:02 被阅读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
    

    相关文章

      网友评论

        本文标题:JavaScript的闭包

        本文链接:https://www.haomeiwen.com/subject/ydjezttx.html