一、什么是閉包?有什么作用?
閉包是指有權訪問另一個函數作用域中的變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量。
作用:1.可以讀取函數內部的變量;2.讓這些變量的值始終保存在內存中。
二、setTimeout()有什么作用?
setTimeout的作用是在“消息隊列”的現有消息的后面再添加一個消息,規定在指定時間執行某段代碼。setTimeout添加的事件,會在下一次Event Loop執行。
三、下面的代碼輸出多少?修改代碼讓fnArr[i] () 輸出 i。使用兩種以上的方法
<pre>
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr3 );
</pre>
輸出結果為10
方法一:
<pre>
var fnArr=[];
for(var i=0;i<10;i++){
(function(n){
fnArr[n]=function(){
return n;
}
})(i);
}
console.log(fnArr3);
</pre>
方法二:
<pre>
var fnArr=[];
for(var i=0;i<10;i++){
fnArr[i]=(function(){
var n=i;
return function(){
return n;
}
})();
}
console.log(fnArr3);
</pre>
四、使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態
<pre>
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
</pre>
實現:
<pre>
var Car=(function(){
var speed=0;
function setSpeed(i){
speed=i;
}
function getSpeed(){
return speed;
}
function accelerate(){
speed+=10;
}
function decelerate(){
speed-=10;
}
function getStatus(){
if(speed>0){
return "running";
}else{
return "stop";
}
}
return{
'setSpeed':setSpeed,
'getSpeed':getSpeed,
'accelerate':accelerate,
'decelerate':decelerate,
'getStatus':getStatus,
'speed':'error'
};
}());
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
</pre>
五、寫一個函數使用setTimeout模擬setInterval的功能
<pre>
var i=0;
var clock=setTimeout(function(){
setTimeout(arguments.callee,1000);
console.log(i++);
},1000);
</pre>
六、寫一個函數,計算setTimeout最小時間粒度
<pre>
//最小時間粒度
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);
}
clock=setTimeout(arguments.callee,0)
},0)
}
</pre>
七、下面這段代碼輸出結果是? 為什么?
<pre>
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
</pre>
輸出結果為:
原因是:以上代碼相當于:
<pre>
var a;
a=1;
console.log(a);
a = 3;
console.log(a);
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
</pre>
setTimeout(f,0)必須要等到當前腳本的所有同步任務結束后執行,所以2最后輸出。
八、下面這段代碼輸出結果是? 為什么?
<pre>
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
</pre>
輸出結果為:不會輸出
原因是:剛開始執行的時候,輸出flag為true,然后要等到while循環執行結束之后,再執行setTimeout(),但是由于flag為true,使得while循環一直進行,沒法執行后面的代碼,因此不會輸出結果。
九、下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現)
<pre>
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
</pre>
實現:
<pre>
for(var i=0;i<5;i++){
(function(){
var n=i;
setTimeout(function(){
console.log('delayer:' + n );
}, 0);
})();
console.log(i);
}
</pre>
版權歸本人所有,若有轉載,請注明來源