1.什么是闭包?有什么作用?
闭包就是:在函数a中声明另一个函数b然后返回b,当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个闭包。内部的函数b可以访问外部a中的变量。
闭包的作用有:1、保护函数内的变量安全。2、在内存中维持一个变量。
2.setTimeout 0 有什么作用
setTimeout的作用是设置延时器,setTimeout 0设置了延时时间为0毫秒,其主要作用实现JavaScript异步,如:
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
console.log(a);
这段代码的执行结果不是 2 2。
而是 1 2。原因是JavaScript 是单线程执行的,也就是无法同时执行多段代码,当某一段代码正在执行的时候,所有后续的任务都必须等待,形成一个队列,一旦当前任务执行完毕,再从队列中取出下一个任务。如果设置了setTimeout,那么浏览器便会在合适的时间,将代码插入任务队列,如果这个时间设为 0,就代表立即插入队列,但不是立即执行,仍然要等待前面代码执行完毕。所以 setTimeout 并不能保证执行的时间,是否及时执行取决于 JavaScript 线程是拥挤还是空闲。所以设置setTimeout(0)相当于告诉浏览器尽可能快的执行。
代码题
1. 下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr[3]() ); //10
//.修改代码让fnArr[i]() 输出 i。第一种方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
(function(n){
fnArr[i] = function(){
return n; }
})(i)
}
//第二种方式
console.log( fnArr[3]() );
(function(){
var n=i;
fnArr[i] = function(){
return n; }
})()
2.使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
function outerFn(){
var speed;
function setSpeed(n){
return speed=n;
}
function getSpeed(){
console.log(speed);
}
function accelerate(){
return speed +=10;
}
function decelerate(){
if(speed >=10){
return speed -=10;
}else{
return speed=0;
}
}
function getStatus(){
if(speed<=0){
console.log('stop');
}else{
console.log('running')
}
}
return {'setSpeed':setSpeed,'getSpeed':getSpeed,'accelerate':accelerate,'decelerate':decelerate,'getStatus':getStatus};
}
var Car=outerFn();
代码测试
3.写一个函数使用setTimeout模拟setInterval的功能
var i=0;
function time(){
i++;
if(i>10){
console.log('结束');
return;
}else{
console.log(i);
setTimeout(time,1000);
}
}
执行:
4.写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
(function mini(){
var i=0;
var start=Date.now();
var clock=setTimeout(function fn(){
i++;
if(i===1000){
var end=Date.now();
console.log((end-start)/i);
}
clock=setTimeout(fn,0)
},0)
})()
5.下面这段代码输出结果是? 为什么?
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)使函数移到这段代码最后才执行。
6.下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0) //function被移到了最后,不能执行
while(flag){} //代码一直卡在了这里
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);
}
输出:
for(var i=0;i<5;i++){
(function(){
var n=i;
setTimeout(function(){
console.log('delayer:' + n );
}, 0);
})()
console.log(i);
}
结果: