js闭包

作者: 爱上帘外修竹 | 来源:发表于2016-06-27 18:06 被阅读0次
    1. 什么是闭包? 有什么作用

    一个函数的执行结果为返回了另一个函数,如:
    function A(){ function B(){ console.log('hello world') } return B; } var C=A(); C(); 函数A的内部变量B被A外部的变量C引用,形成了闭包

    2. setTimeout 0 有什么作用

    待执行的语句延迟时间为0,但是待执行语句将在本段代码的末尾执行

    代码题

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

    var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return i; } } console.log( fnArr[3]() ); // 10
    代码修改如下:
    1#
    var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(j){ function fn(){ return j; } return fn; }(i); } console.log( fnArr[3]() ); // 3
    2#
    var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return arguments.collee.index; } fnArr[i].index=i; } console.log( fnArr[3]() ); // 3

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

    var Car =( function(){ var Speed=0; function setSpeed(Sp){ Speed=Sp; } function getSpeed(){ console.log(Speed); } function accelerate(){ Speed+=10; } function decelerate(){ Speed-=10; } function getStatus(){ return Speed>0? 'running':'stop'; } return { 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 setInterval2(fn, intv) { setTimeout(function() { fn(); setInterval2(fn, intv); }, intv); }

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

    function getLi(){ 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) } setTimeout( arguments.callee,0) }),0) } getLi();

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

    var a = 1; setTimeout(function(){ a = 2; console.log(a); }, 0); var a ; console.log(a); a = 3; console.log(a);
    由于setTimeout的作用,以上代码相当于:
    var a = 1; a=1 ; console.log(a); // 1 a = 3; console.log(a); //3 (function(){ a = 2; console.log(a);//2 }());

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

    var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} // 由于setTimeout延迟执行,flag为true,while陷入死循环 console.log(flag);

    7. 下面这段代码输出?如何输出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 // delayer:5 // delayer:5 // delayer:5 // delayer:5
    如下:
    for(var i=0;i<5;i++){ setTimeout( (function(j){ console.log('delayer:' + j ); }(i) ), 0); console.log(i); }
    本文版权归本人(帘外修竹)所有,转载须说明来源

    相关文章

      网友评论

          本文标题:js闭包

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