美文网首页
闭包知识点总结

闭包知识点总结

作者: 谢环志 | 来源:发表于2016-09-04 18:48 被阅读0次

    问答

    • 什么是闭包? 有什么作用
      答:
      1.闭包就是有权访问另一个函数作用域中的变量的函数,常见的是一个函数里有内部函数,内部函数访问外部函数的局部变量。
      2.1,读取内部变量;2,这些变量可以保存在内存中。

    • setTimeout 0 有什么作用
      答:其他代码执行结束后,立即执行setTimeout 0 的代码。0 代表延迟执行时间

    代码

    • 下面的代码输出多少?修改代码让fnArri
      输出 i。使用两种以上的方法
     var fnArr = []; 
    for (var i = 0; i < 10; i ++) {
     fnArr[i] = function(){
     return i;
     }; } 
    console.log( fnArr[3]() ); //10
    

    答:
    方法一

    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[n] = function() { 
    return n } }())}
    console.log(fnArr[3]())
    
    • 使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
    var Car = (function() {
        var speed = 0;
        function accelerate() {
            speed += 10;
        }
        function decelerate() {
            speed -= 10;
        }
        function getSpeed() {
            console.log(speed);
            return speed;
        }
        function getStatus() {
            if (speed > 0) {
                console.log('running');
            }else {
                console.log('stop');
            }  
        }
        function setSpeed(i) {
            speed = i;
        }
        return {
            accelerate: accelerate,  
            decelerate: decelerate,
            getSpeed: getSpeed,
            getStatus: getStatus,
            setSpeed: setSpeed 
        };
    }());
    
    • 写一个函数使用setTimeout模拟setInterval的功能
    var i = 0
    function intv() {
      setTimeout(function() {
          console.log(i++) 
          intv()
      }, 1000)
    }
    
    • 写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
    function getmin(){
        var i = 0;
        var start = Date.now();
        var clock = setTimeout(function(){
            i++;
            if(i === 1000){
                clearTimeout(clock)
                var end = Date.now();
                console.log((end-start)/i);
            }
            clock = setTimeout(arguments.callee,0)
        },0)
    }
    getmin()
    

    下面这段代码输出结果是? 为什么?

    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);
    }, 0);
    var a ;
    console.log(a);
    a = 3;
    console.log(a);
    

    答:输出结果为1,3,2.
    因为setTimeout(,0)使内容被放到执行对列最后,等其他执行完毕后才立即执行。

    *下面这段代码输出结果是? 为什么?

    var flag = true;
    setTimeout(function(){
        flag = false;
    },0);
    while(flag){}
    console.log(flag);
    

    答:没有输出。因为setTimeout是在执行完其他代码之后再执行,所以在执行完第一句之后,就到了下面的while循环,flag为true,为死循环,执行空语句,无输出。

    *下面这段代码输出?如何输出delayer: 0, delayer:1...(使用闭包来实现)

    for(var i=0;i<5;i++){
        setTimeout(function(){
             console.log('delayer:' + i );
        }, 0);
        console.log(i);
    }
    

    答:输出是0,1,2,3,4,delayer:5(五次)。

    for (var i = 0; i < 5; i++) { 
    setTimeout((function(num) {
     return function() {
     return console.log('delayer: ' + num) }
    }(i)),0) 
    console.log(i)}
    

    相关文章

      网友评论

          本文标题:闭包知识点总结

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