js闭包

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); }
本文版权归本人(帘外修竹)所有,转载须说明来源

你可能感兴趣的:(js闭包)