问题
1.什么是闭包? 有什么作用
闭包是指能够访问自由变量的函数(变量在本地使用,但在闭包中定义)。换句话说,定义在闭包中的函数可以“记忆”它被创建时候的环境。MDN参考
作用:可以维持一个独立的数据空间,下次用的时候内存不会被释放。
2.setTimeout 0 有什么作用
1、实现javascript的异步:
正常情况下javascript都是按照顺序执行的。但是我们可能让该语句后面的语句执行完再执行本身,这时就可以用到setTimeout延时0ms来实现了。如:
alert(1);
setTimeout("alert(2)", 0);
alert(3);
虽然延时了0ms,但是执行顺序为:1,3,2 这样就保证setTimeout里面的语句在某一代码段中最后执行。
2、在事件中,setTimeout 会在其完成当前任何延宕事件的事件处理器的执行,以及完成文档当前状态更新后,告诉浏览器去启用 setTimeout 内注册的函数。 举个例子来说这句话的意思,假如当某个事件在页面上建立一个文本框,并给文本框赋值(完成文档当前状态更新),然后将焦点定到文本框,并且选中文本框的内容(后面部分就需要用到setTimeout 延迟0ms实现,否则不好实现)。
代码
- 下面的代码输出多少?修改代码让
fnArr[i]()
输出 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++){
(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[i] = function(){
return n;
};
})()
}
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]() );
- 使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = //todo;
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
var Car = (function(){
var speed = 0;
function setSpeed(a){
speed = a;
}
function getSpeed(){
return speed;
}
function accelerate(){
speed = speed+10;
}
function decelerate(){
speed = speed-10;
}
function getStatus(){
if(speed>0){
return "running"
}else{
return "stop"
}
}
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
- 写一个函数使用
setTimeout
模拟setInterval
的功能
function simulate(){
setTimeout(function(){
console.log(i++);
simulate()
}, 3000);
}
- 写一个函数,计算setTimeout平均最小时间粒度
function getMini(){
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)
}
- 下面这段代码输出结果是? 为什么?
var a = 1;
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
我们可以这么看
var a ;
var a ;
a = 1;
console.log(a);
a = 3;
console.log(a);
setTimeout(function(){
a = 2;
console.log(a);
}, 0);
所以结果为1,3,2
;
- 下面这段代码输出结果是? 为什么?
var flag = true;
setTimeout(function(){
flag = false;
},0)
while(flag){}
console.log(flag);
没有输出。因为setTimeout是在执行完其他代码之后再执行,所以在执行完第一句之后,就到了下面的while循环,flag为true,为死循环,执行空语句,无输出。
- 下面这段代码输出?如何输出
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);
})()
}
本文版权归作者饥人谷_Josh和饥人谷所有,转载请注明来源