JavaScript 閉包、定時(shí)器

1.什么是閉包? 有什么作用?

閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)。舉例:

var num = 10
function fn3() {
    var num3 = 20;
    function fn4() {
        return num3;
    } 
    return fn4;
}
var func = fn3;
console.log(func());
  • 上述代碼中fn4就是閉包,通過(guò)fn3內(nèi)部的局部方法fn4,就能獲得外部的局部變量,即可以得到num3的值是多少,如果不使用閉包,在外部無(wú)法獲取到func3內(nèi)部的局部變量。

作用:一個(gè)是可以讀取函數(shù)內(nèi)部的變量,另一個(gè)就是讓這些變量的值始終保持在內(nèi)存中。

2.setTimeout 0 有什么作用?

setTimeout函數(shù)用來(lái)指定某個(gè)函數(shù)或某段代碼,在多少毫秒之后執(zhí)行。它返回一個(gè)整數(shù),表示定時(shí)器的編號(hào),以后可以用來(lái)取消這個(gè)定時(shí)器。
作用是實(shí)現(xiàn)javascript的異步,也就是說(shuō)加入了(setTimeout(function(){ },0)的話,讓(function(){ }在現(xiàn)有的任務(wù)(腳本的同步任務(wù)和“任務(wù)隊(duì)列”中已有的事件)一結(jié)束就立刻執(zhí)行。例如:

alert(1);
setTimeout("alert(2)", 0);
alert(3);
輸出結(jié)果

3.下面的代碼輸出多少?修改代碼讓fnArr [i] ()輸出 i。使用兩種以上的方法

var fnArr = [];
for (var i = 0; i < 10; i ++) {
     fnArr[i] =  function(){
          return i;
     };
}
console.log( fnArr[3]() ); 
輸出結(jié)果

方法一:

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

方法二:

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

4.使用閉包封裝一個(gè)汽車對(duì)象,可以通過(guò)如下方式獲取汽車狀態(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

代碼如下:

function testCar(){
    var speed = 0;
    function setSpeed(n){
        speed = n;
    }
    function getSpeed(){
        console.log(speed);
        return speed;
    }
    function accelerate(){
        speed += 10;
    }
    function decelerate(){
        speed -= 10;
    }
    function getStatus(){
        if(speed > 0){
            console.log("running");
        }else{
            console.log("stop");
        }
    }
    return {
        setSpeed:setSpeed,
        getSpeed:getSpeed,
        accelerate:accelerate,
        decelerate:decelerate,
        getStatus:getStatus
    }
}
var Car = testCar();

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

var i = 0;
function intv() {
    setTimeout(function() {
        console.log(i++);
        intv(i++);
    },3000);
}
intv();

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

function getMini() {
    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);
        }
    timer = setTimeout(arguments.callee,0);
    },0);
}
輸出結(jié)果

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

var a = 1;
setTimeout(function(){
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
//輸出的結(jié)果依次為:1,3,2,由于使用了(setTimeout(function(){ },0),所以是放在隊(duì)尾執(zhí)行
輸出結(jié)果

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

var flag = true;
setTimeout(function(){
    flag = false;
},0)
while(flag){}
console.log(flag);
//將會(huì)一直循環(huán),沒(méi)有結(jié)果,還是因?yàn)椋╯etTimeout(function(){ },0)的作用,會(huì)放在隊(duì)尾執(zhí)行,當(dāng)執(zhí)行完第一行代碼后,接著執(zhí)行while循環(huán)語(yǔ)句,判斷條件為真,最后將會(huì)一直循環(huán)。

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

for(var i=0;i<5;i++){ 
    setTimeout(function(){ 
        console.log('delayer:' + i ); 
    }, 0); 
    console.log(i);
}
輸出結(jié)果

代碼:

for(var i=0;i<5;i++){ 
    (function() {
        var n = i
        setTimeout(function(){ 
            console.log('delayer:' + n ); 
        }, 0); 
    })();
    console.log(i);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 閉包及其作用 閉包是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù);相當(dāng)于在草原上用柵欄單獨(dú)圍一片地只留一個(gè)進(jìn)出口;只有通過(guò)返回出...
    柯良勇閱讀 732評(píng)論 0 0
  • 1.什么是閉包? 有什么作用 閉包是指有權(quán)訪問(wèn)另一個(gè)函數(shù)作用域中的變量的函數(shù),常見(jiàn)到的方式,就是在一個(gè)函數(shù)內(nèi)部創(chuàng)建...
    INTERNALENVY閱讀 301評(píng)論 0 0
  • 什么是閉包? 有什么作用 因?yàn)閖s只存在局部變量和全局變量,函數(shù)內(nèi)部可以訪問(wèn)外部變量,而外部卻不能訪問(wèn)局部變量。閉...
    沒(méi)夢(mèng)想的咸魚(yú)丶閱讀 182評(píng)論 0 0
  • 小練習(xí): 題目1: 下面的代碼輸出多少?修改代碼讓 fnArri 輸出 i。使用兩種以上的方法 改寫方法一: 改寫...
    Sketch閱讀 265評(píng)論 0 0
  • 1.下面的代碼輸出多少?修改代碼讓 fnArr[i]() 輸出 i。使用 兩種以上的方法 2.封裝一個(gè)汽車對(duì)象,可...
    liushaung閱讀 220評(píng)論 0 2

友情鏈接更多精彩內(nèi)容