問答
-
什么是閉包? 有什么作用
答:“官方”的解釋是:閉包是一個擁有許多變量和綁定了這些變量的環(huán)境的表達(dá)式(通常是一個函數(shù))姨伟,因而這些變量也是該表達(dá)式的一部分窑多。由于在Javascript語言中,只有函數(shù)內(nèi)部的子函數(shù)才能讀取局部變量拳芙,因此可以把閉包簡單理解成“定義在一個函數(shù)內(nèi)部的函數(shù)”察藐。所以,在本職上舟扎,閉包就是將函數(shù)內(nèi)部和函數(shù)外部連接起來的一座橋梁分飞。
作用:- 讀取函數(shù)內(nèi)部的變量。
- 讓變量的值始終保存在內(nèi)存中睹限。
setTimeout 0 有什么作用
答:setTimeout(func|code,0)
譬猫,作用是實現(xiàn)此代碼或者函數(shù)的異步,等待所有常規(guī)js代碼執(zhí)行完畢后再開始執(zhí)行羡疗。
代碼題
-
下面的代碼輸出多少染服?修改代碼讓fnArri 輸出 i。使用兩種以上的方法
//題目
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr3 ); //
```
第一種
```
var fnArr = [];
for(var i = 0; i<10; i++){
fnArr[i] = (function(n){
return function(){
return n;
}
})(i)
}
console.log( fnArr[3]() );
```
第二種
```
var fnArr = [];
for(var i =0;i<10;i++){
(function(){
var n = i;
fnArr[i] = function(){
return n;
}
})()
}
console.log( fnArr[3]() );
```
-
使用閉包封裝一個汽車對象叨恨,可以通過如下方式獲取汽車狀態(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 car(){ var speed = 0; function setSpeed(num){ return speed = num; } function getSpeed(){ return speed; } function accelerate(){ return speed +=10; } function decelerate(){ return speed -=10; } function getStatus(){ if(speed>0){ return "running"; }else{ return "stop"; } } return{ getSpeed:getSpeed, setSpeed:setSpeed, accelerate:accelerate, decelerate:decelerate, getStatus:getStatus }; } var Car = 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';
-
寫一個函數(shù)使用setTimeout模擬setInterval的功能
var i = 0; (function count(){ i +=1; setTimeout(count,1000); })(); console.log(i);
-
寫一個函數(shù)柳刮,計算setTimeout平均[備注:新加]最小時間粒度
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();
-
下面這段代碼輸出結(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,因為 setTimeout 0會把當(dāng)前函數(shù)放到隊尾執(zhí)行。
-
下面這段代碼輸出結(jié)果是? 為什么?
var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} console.log(flag); //沒有輸出诚亚,setTimeout為0里面的函數(shù)放到隊尾執(zhí)行。while循環(huán)里面一直是true午乓,執(zhí)行空語句所以沒有輸出站宗。
-
下面這段代碼輸出?如何輸出delayer: 0, delayer:1...(使用閉包來實現(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++){
setTimeout((function(n){
console.log('delayer:' + n );
})(i), 0);
console.log(i);
}
```