問答
什么是閉包? 有什么作用
答:
1.閉包就是有權(quán)訪問另一個(gè)函數(shù)作用域中的變量的函數(shù),常見的是一個(gè)函數(shù)里有內(nèi)部函數(shù)流部,內(nèi)部函數(shù)訪問外部函數(shù)的局部變量戚绕。
2.1,讀取內(nèi)部變量枝冀;2舞丛,這些變量可以保存在內(nèi)存中。setTimeout 0 有什么作用
答:其他代碼執(zhí)行結(jié)束后果漾,立即執(zhí)行setTimeout 0 的代碼球切。0 代表延遲執(zhí)行時(shí)間
代碼
- 下面的代碼輸出多少?修改代碼讓fnArri
輸出 i绒障。使用兩種以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
}; }
console.log( fnArr[3]() ); //10
答:
方法一
var fnArr = [];
for(var i=0;i<10;i++){
(function(n){
fnArr[i] = function(){
return n;
};
})(i);
console.log( fnArr[3]() );
方法二
var fnArr = []
for (var i = 0; i < 10; i++) {
(function() {
var n = i
fnArr[n] = function() {
return n } }())}
console.log(fnArr[3]())
- 使用閉包封裝一個(gè)汽車對(duì)象吨凑,可以通過如下方式獲取汽車狀態(tài)
var Car = (function() {
var speed = 0;
function accelerate() {
speed += 10;
}
function decelerate() {
speed -= 10;
}
function getSpeed() {
console.log(speed);
return speed;
}
function getStatus() {
if (speed > 0) {
console.log('running');
}else {
console.log('stop');
}
}
function setSpeed(i) {
speed = i;
}
return {
accelerate: accelerate,
decelerate: decelerate,
getSpeed: getSpeed,
getStatus: getStatus,
setSpeed: setSpeed
};
}());
- 寫一個(gè)函數(shù)使用setTimeout模擬setInterval的功能
var i = 0
function intv() {
setTimeout(function() {
console.log(i++)
intv()
}, 1000)
}
- 寫一個(gè)函數(shù),計(jì)算setTimeout平均[備注:新加]最小時(shí)間粒度
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)
}
getmin()
下面這段代碼輸出結(jié)果是? 為什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
答:輸出結(jié)果為1,3,2.
因?yàn)閟etTimeout(,0)使內(nèi)容被放到執(zhí)行對(duì)列最后户辱,等其他執(zhí)行完畢后才立即執(zhí)行鸵钝。
*下面這段代碼輸出結(jié)果是? 為什么?
var flag = true;
setTimeout(function(){
flag = false;
},0);
while(flag){}
console.log(flag);
答:沒有輸出。因?yàn)閟etTimeout是在執(zhí)行完其他代碼之后再執(zhí)行焕妙,所以在執(zhí)行完第一句之后蒋伦,就到了下面的while循環(huán),flag為true焚鹊,為死循環(huán)痕届,執(zhí)行空語句韧献,無輸出。
*下面這段代碼輸出研叫?如何輸出delayer: 0, delayer:1...(使用閉包來實(shí)現(xiàn))
for(var i=0;i<5;i++){
setTimeout(function(){
console.log('delayer:' + i );
}, 0);
console.log(i);
}
答:輸出是0锤窑,1,2,3,4,delayer:5(五次)嚷炉。
for (var i = 0; i < 5; i++) {
setTimeout((function(num) {
return function() {
return console.log('delayer: ' + num) }
}(i)),0)
console.log(i)}