1. 什么是閉包? 有什么作用
一個函數的執行結果為返回了另一個函數,如:
function A(){ function B(){ console.log('hello world') } return B; } var C=A(); C(); 函數A的內部變量B被A外部的變量C引用,形成了閉包
2. setTimeout 0 有什么作用
待執行的語句延遲時間為0,但是待執行語句將在本段代碼的末尾執行
代碼題
1. 下面的代碼輸出多少?修改代碼讓fnArri輸出 i。使用兩種以上的方法
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return i; } } console.log( fnArr[3]() ); // 10
代碼修改如下:
1#
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(j){ function fn(){ return j; } return fn; }(i); } console.log( fnArr[3]() ); // 3
2#
var fnArr = []; for (var i = 0; i < 10; i ++) { fnArr[i]=function(){ return arguments.collee.index; } fnArr[i].index=i; } console.log( fnArr[3]() ); // 3
2. 使用閉包封裝一個汽車對象,可以通過如下方式獲取汽車狀態
var Car =( function(){ var Speed=0; function setSpeed(Sp){ Speed=Sp; } function getSpeed(){ console.log(Speed); } function accelerate(){ Speed+=10; } function decelerate(){ Speed-=10; } function getStatus(){ return Speed>0? 'running':'stop'; } return { setSpeed: setSpeed, getSpeed: getSpeed, accelerate: accelerate, decelerate: decelerate, getStatus: getStatus } }() ) 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
3. 寫一個函數使用setTimeout模擬setInterval的功能
function setInterval2(fn, intv) { setTimeout(function() { fn(); setInterval2(fn, intv); }, intv); }
4. 寫一個函數,計算setTimeout最小時間粒度
function getLi(){ 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) } setTimeout( arguments.callee,0) }),0) } getLi();
5. 下面這段代碼輸出結果是? 為什么?
var a = 1; setTimeout(function(){ a = 2; console.log(a); }, 0); var a ; console.log(a); a = 3; console.log(a);
由于setTimeout的作用,以上代碼相當于:
var a = 1; a=1 ; console.log(a); // 1 a = 3; console.log(a); //3 (function(){ a = 2; console.log(a);//2 }());
6. 下面這段代碼輸出結果是? 為什么?
var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} // 由于setTimeout延遲執行,flag為true,while陷入死循環 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); } // 0 // 1 // 2 // 3 // 4 // delayer:5 // delayer:5 // delayer:5 // delayer:5 // delayer:5
如下:
for(var i=0;i<5;i++){ setTimeout( (function(j){ console.log('delayer:' + j ); }(i) ), 0); console.log(i); }
本文版權歸本人(簾外修竹)所有,轉載須說明來源