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);
}
結果:
圖片標題