1.什么是閉包? 有什么作用
- 一個函數,能夠訪問另一個函數作用域中的變量。
- 作用:一、使變量保存在內存中,不被回收。二、可以讀取內部變量。
閉包就是能夠讀取其他函數內部變量的函數。由于在Javascript語言中,只有函數內部的子函數才能讀取局部變量,因此可以把閉包簡單理解成"定義在一個函數內部的函數"。所以,在本質上,閉包就是將函數內部和函數外部連接起來的一座橋梁。
使用閉包的注意點::由于閉包會使得函數中的變量都被保存在內存中,內存消耗很大,所以不能濫用閉包,否則會造成網頁的性能問題,在IE中可能導致內存泄露。
2.setTimeout 0 有什么作用
把該語句放到最后,等其他語句執行完畢后立即執行 setTimeout 0 語句。0為延遲時間。
Paste_Image.png
3.下面的代碼輸出多少?修改代碼讓fnArr() 輸出 i。使用兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return 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]() ); //
方法二:
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = (function(){
var n = i;
return function(){
return n;
}
})();
}
console.log( fnArr[3]() ); //
方法三:
//方法3
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(){
var n = i;
fnArr[i] = function(){
return n;
}
})();
}
console.log( fnArr[3]() ); //
4.使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態
var Car = (function(){
var speed = 0;
function setSpeed(n){
speed = n;
}
function getSpeed(){
return speed;
}
function accelerate(){
speed += 10;
}
function decelerate(){
speed -= 10;
}
function getStatus(){
if(speed === 0){
return 'stop';
}else{
return 'running';
}
}
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
5.寫一個函數使用setTimeout模擬setInterval的功能
var i = 0;
function a(){
setTimeout (function(){
console.log(i++);
a()
},3000)
}
setTimeout:指定時間后執行一次
setInterval:每間隔時間重復執行
6.寫一個函數,計算setTimeout平均[備注:新加]最小時間粒度
function getMin(){
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);
}
7.下面這段代碼輸出結果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);//2
}, 0);
var a ;
console.log(a);//1
a = 3;
console.log(a);//3
原因是setTimeout()優先級放在最后所以結果是1,3,2。
8.下面這段代碼輸出結果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
沒有輸出。因為setTimeout是在執行完其他代碼之后再執行,所以在執行完第一句之后,就到了下面的while循環,flag為true,為死循環,執行空語句,無輸出。
9.下面這段代碼輸出?如何輸出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);
}
方法二:
Paste_Image.png
方法三:
for(var i=0;i<5;i++){
setTimeout((function(i){
return function() {
return console.log('delayer:' + i );
}
}(i)), 0);
console.log(i);
}
方法四:
for(var i=0;i<5;i++){
setTimeout((function(){
var n = i;
return function () {
return console.log('delayer:' + n );
}
}()), 0);
console.log(i);
}