问答
-
什么是闭包? 有什么作用
答:“官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。所以,在本职上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
作用:- 读取函数内部的变量。
- 让变量的值始终保存在内存中。
setTimeout 0 有什么作用
答:setTimeout(func|code,0)
,作用是实现此代码或者函数的异步,等待所有常规js代码执行完毕后再开始执行。
代码题
-
下面的代码输出多少?修改代码让fnArri 输出 i。使用两种以上的方法
//题目
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
};
}
console.log( fnArr3 ); //
```
第一种
```
var fnArr = [];
for(var i = 0; i<10; i++){
fnArr[i] = (function(n){
return 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 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
function car(){ var speed = 0; function setSpeed(num){ return speed = num; } function getSpeed(){ return speed; } function accelerate(){ return speed +=10; } function decelerate(){ return speed -=10; } function getStatus(){ if(speed>0){ return "running"; }else{ return "stop"; } } return{ getSpeed:getSpeed, setSpeed:setSpeed, accelerate:accelerate, decelerate:decelerate, getStatus:getStatus }; } var Car = 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';
-
写一个函数使用setTimeout模拟setInterval的功能
var i = 0; (function count(){ i +=1; setTimeout(count,1000); })(); console.log(i);
-
写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
function getMini(){ var i=0; var start=Date.now(); var timer=setTimeout(function (){ i++; if (i==1000){ var end=Date.now(); clearTimeout(timer); console.log((end-start)/i); } timer=setTimeout(arguments.callee,1); },1); } getMini();
-
下面这段代码输出结果是? 为什么?
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会把当前函数放到队尾执行。
-
下面这段代码输出结果是? 为什么?
var flag = true; setTimeout(function(){ flag = false; },0) while(flag){} console.log(flag); //没有输出,setTimeout为0里面的函数放到队尾执行。while循环里面一直是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++){
setTimeout((function(n){
console.log('delayer:' + n );
})(i), 0);
console.log(i);
}
```