任務(wù)20

問題

1.什么是閉包? 有什么作用?
閉包的含義:

  • 在一個(gè)函數(shù)中(父函數(shù))return出另一個(gè)函數(shù)(子函數(shù)),該子函數(shù)訪問了父函數(shù)中的局部變量,使父函數(shù)里面的內(nèi)存不能被釋放。這就生成了一個(gè)閉包。下面這段代碼就是典型的閉包:
(function (){
    function deal(){
        var a=1;
        function inc(){
            console.log(++a);
        }
        return inc;
    }
    var inc=deal();
    inc();
    inc();
}())

輸出結(jié)果為2和3;

作用:

  • 可維持一個(gè)獨(dú)立的數(shù)據(jù)空間;下次在用時(shí),這個(gè)內(nèi)存不用釋放,就可通過暴露出的這個(gè)函數(shù)去操作這些變量,讓它發(fā)生一些改變。

2.setTimeout 0 有什么作用?
setTimeout(function(){},ms) setTimeout傳入了兩個(gè)參數(shù),第一個(gè)參數(shù)是所需要實(shí)現(xiàn)的功能函數(shù);第二個(gè)參數(shù)為延遲的毫秒數(shù);setTimeout是一個(gè)延時(shí)函數(shù),當(dāng)設(shè)定延遲的時(shí)間為0時(shí),有如下作用:

  • 會(huì)使setTimeout內(nèi)部的函數(shù)在其他代碼執(zhí)行完后再去執(zhí)行.
console.log(4);
    setTimeout(function () {
        console.log(2);
    },0);
console.log(7);

輸出結(jié)果為:



上述例子中console.log(2)是最后執(zhí)行的.

代碼題

1.下面的代碼輸出多少?修改代碼讓fnArri 輸出 i。使用兩種以上的方法

var fnArr = [];
for (var i = 0; i < 10; i ++) {
    fnArr[i] =  function(){
        return i;
    };
}
console.log( fnArr[3]() );  //輸出結(jié)果為10,,因?yàn)楹瘮?shù)執(zhí)行之前i=10;在for循環(huán)中i的值并沒有隨著循環(huán)保存在函數(shù)中,所以我們需要用閉包的方式來保存i的值;

方法一:

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

方法二:

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

2.使用閉包封裝一個(gè)汽車對象,可以通過如下方式獲取汽車狀態(tài)

var Car = //todo;
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

實(shí)現(xiàn)代碼如下:

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

3.寫一個(gè)函數(shù)使用setTimeout模擬setInterval的功能

var i=0;
 (function Count(){
   i +=1;
   setTimeout(Count,1000);
   })();
 console.log(i);

4.寫一個(gè)函數(shù),計(jì)算setTimeout平均[備注:新加]最小時(shí)間粒度

function getMini(){
    var i=0;
    var start=Date.now();
    var timer=setTimeout(function (){
    i++;
    if (i==1000){
        var end=Date.now();
        clearTimeout(timer);
        console.log((end-start)/i);
     }                  
    timer=setTimeout(arguments.callee,1);
    },1);
}
getMini(); 

5.下面這段代碼輸出結(jié)果是? 為什么?

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

依次輸出1,3,2,因?yàn)?setTimeout 0會(huì)把當(dāng)前函數(shù)放到最后執(zhí)行

6.下面這段代碼輸出結(jié)果是? 為什么?

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

while方法會(huì)無限循環(huán),無任何輸出。setTimeout函數(shù)會(huì)把指定的任務(wù)放在最后執(zhí)行,變量flag一直為true,所以while方法會(huì)無限循環(huán)。

7.下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn))

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

方法一:

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

方法二:

for(var i=0; i<5; i++){
         setTimeout((function(n){
             return function(){
                 return console.log("delayer:" + n);
             }
         })(i),0)
         console.log(i);
     }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 問答 什么是閉包? 有什么作用答:“官方”的解釋是:閉包是一個(gè)擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一...
    饑人谷_桶飯閱讀 231評(píng)論 0 0
  • 1.什么是閉包? 有什么作用? 閉包的英文單詞是closure,是指有權(quán)訪問另一個(gè)函數(shù)作用域中變量的函數(shù)。 閉包在...
    GarenWang閱讀 379評(píng)論 0 0
  • 問題 一、什么是閉包? 有什么作用? 1.什么是閉包①JavaScript高級(jí)程序設(shè)計(jì)第三版定義閉包是指有權(quán)訪問另...
    鴻鵠飛天閱讀 476評(píng)論 0 0
  • 問題 1. 什么是閉包? 有什么作用? 概念:閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。由于在Javascript語...
    小木子2016閱讀 354評(píng)論 0 0
  • 1.什么是閉包?有什么作用? 閉包就是:在函數(shù)a中聲明另一個(gè)函數(shù)b然后返回b,當(dāng)函數(shù)a的內(nèi)部函數(shù)b被函數(shù)a外的一個(gè)...
    黃露hl閱讀 482評(píng)論 0 0