level-20

作者: lurker | 来源:发表于2016-04-03 14:20 被阅读13次

    什么是闭包? 有什么作用

    简单来说闭包就是在一个函数中创建一个函数,这个函数有权访问其他作用域中变量。相当于函数内部和函数外部相连接的一个桥梁。
    闭包的作用:

    • 实现封装,通过闭包,能在外部环境访问一个函数内部的变量。

    setTimeout 0 有什么作用

    实现JavaScript的异步,正常时候JavaScript都是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。这也常被称为 “阻塞式执行”。使用setTimeout 0之后可以使得改语句的加载顺序发生改变。例如

    console.log(1);
    setTimeout("console.log(2)",0);
    console.log(3);
    //这样就会以此输入1,3,2
    

    下面的代码输出多少?修改代码让fnArri输出 i。使用两种以上的方法

        var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                return i;
            };
        }
        console.log( fnArr[3]() );
        //创建一个自执行匿名函数
         var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function(){
                var b=i;
                return function(){
                    return b;
                }
            }(i);
        }
        console.log( fnArr[3]() );
        //给函数绑定一个属性。
            var fnArr = [];
        for (var i = 0; i < 10; i ++) {
            fnArr[i] =  function arr(){
                return arr.fn;
            };
            fnArr[i].fn=i;
        }
        console.log( fnArr[3]() );
    

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

    var Car = function (){
        var speed;
    
        function setSpeed(num){
            speed=num;
        }
    
        function getSpeed(){
            console.log(speed);
            return speed;
        }
    
        function accelerate(){
            speed+=10;
        }
    
        function decelerate(){
            speed-=10;
        }
    
        function getStatus(){
            if(speed==0){
                console.log("stop");
            }
            else{
                console.log("running");
            }
        }
        return{
            speed:speed,
            setSpeed:setSpeed,
            getSpeed:getSpeed,
            accelerate:accelerate,
            decelerate:decelerate,
            getStatus:getStatus,
        }
    }();
    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';
    // Car.speed;  //error
    

    3.下写一个函数使用setTimeout模拟setInterval的功能

    function add(){
        var time=new Date();
        console.log("当前时间是"+time.getHours()+"点"+time.getMinutes()+"分"+time.getSeconds()+"秒");
        add();
    }
            setTimeout("add()",1000);
        // setInterval("add()",1000);
    

    写一个函数,计算setTimeout最小时间粒度

    function getTime(){
        var start=new Date();
        var a=0;
        var click=setTimeout(function(){
            a++;
            if(a==1000){
                clearTimeout(click);
                var end=new Date();
                time=((end-start)/1000);
                console.log(time);
            }
           click= setTimeout(arguments.callee, 0);
        },0)
    }
    getTime();//4.06
    

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

    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a);//2
    }, 0);
    var a ;
    console.log(a);//1
    a = 3;
    console.log(a);//3
    //依次输出1、3、2;
    //因为setTimeot 0的特性,使得function(){}会放在最后执行。
    

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

    var flag = true;
    setTimeout(function(){
        flag = false;
    },0)
    while(flag){}
    console.log(flag);
    //会一直卡在while 循环这里。控制台无输出。
    //因为setTimeout 0 的特性,匿名函数function(){},需要等其他方法执行完,才执行。
    //而while(flag){}  这个方法一直判断为真,一直循环。卡死在这。
    

    下面这段代码输出?如何输出delayer: 0, delayer:1...

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

    相关文章

      网友评论

          本文标题:level-20

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