任務20

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

閉包就是:在函數a中聲明另一個函數b然后返回b,當函數a的內部函數b被函數a外的一個變量引用的時候,就創建了一個閉包。內部的函數b可以訪問外部a中的變量。
閉包的作用有:1、保護函數內的變量安全。2、在內存中維持一個變量。

2.setTimeout 0 有什么作用

setTimeout的作用是設置延時器,setTimeout 0設置了延時時間為0毫秒,其主要作用實現JavaScript異步,如:

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

這段代碼的執行結果不是 2 2。
而是 1 2。原因是JavaScript 是單線程執行的,也就是無法同時執行多段代碼,當某一段代碼正在執行的時候,所有后續的任務都必須等待,形成一個隊列,一旦當前任務執行完畢,再從隊列中取出下一個任務。如果設置了setTimeout,那么瀏覽器便會在合適的時間,將代碼插入任務隊列,如果這個時間設為 0,就代表立即插入隊列,但不是立即執行,仍然要等待前面代碼執行完畢。所以 setTimeout 并不能保證執行的時間,是否及時執行取決于 JavaScript 線程是擁擠還是空閑。所以設置setTimeout(0)相當于告訴瀏覽器盡可能快的執行。

代碼題

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

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

//.修改代碼讓fnArr[i]() 輸出 i。第一種方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
    (function(n){
        fnArr[i] =  function(){
        return n; }
    })(i)
}
//第二種方式
console.log( fnArr[3]() ); 
    (function(){
        var n=i;
        fnArr[i] =  function(){
        return n; }
    })()

2.使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態

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

代碼測試


圖片標題
圖片標題

3.寫一個函數使用setTimeout模擬setInterval的功能

var i=0;
function time(){
    i++;
    if(i>10){
        console.log('結束');
        return;
    }else{
        console.log(i);
        setTimeout(time,1000);
    }
}

執行:


圖片標題
圖片標題

4.寫一個函數,計算setTimeout平均[備注:新加]最小時間粒度

(function mini(){
    var i=0;
    var start=Date.now();
    var clock=setTimeout(function fn(){
        i++;
        if(i===1000){
            var end=Date.now();
            console.log((end-start)/i);
        }
        clock=setTimeout(fn,0)
    },0)
})()

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

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)使函數移到這段代碼最后才執行。

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

var flag = true;
setTimeout(function(){
    flag = false;
},0) //function被移到了最后,不能執行
while(flag){} //代碼一直卡在了這里
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);
}

輸出:


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

結果:


圖片標題
圖片標題
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 問題 一、什么是閉包? 有什么作用? 1.什么是閉包①JavaScript高級程序設計第三版定義閉包是指有權訪問另...
    鴻鵠飛天閱讀 476評論 0 0
  • 問答 什么是閉包? 有什么作用答:“官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一...
    饑人谷_桶飯閱讀 231評論 0 0
  • 問題 1. 什么是閉包? 有什么作用? 概念:閉包就是能夠讀取其他函數內部變量的函數。由于在Javascript語...
    小木子2016閱讀 354評論 0 0
  • 問題 1.什么是閉包? 有什么作用?閉包的含義: 在一個函數中(父函數)return出另一個函數(子函數),該子函...
    璐璐熙可閱讀 368評論 0 1
  • 2017-11-15.星期四。 昨夜,丹寶又哭了,我趕緊過去陪她,拍了拍慢慢睡著了。后來又哭了幾次,害得我我也沒有...
    風舞雨蹈閱讀 222評論 0 0