问答
什么是闭包? 有什么作用
答:
1.闭包就是有权访问另一个函数作用域中的变量的函数,常见的是一个函数里有内部函数,内部函数访问外部函数的局部变量。
2.1,读取内部变量;2,这些变量可以保存在内存中。setTimeout 0 有什么作用
答:其他代码执行结束后,立即执行setTimeout 0 的代码。0 代表延迟执行时间
代码
- 下面的代码输出多少?修改代码让fnArri
输出 i。使用两种以上的方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
fnArr[i] = function(){
return i;
}; }
console.log( fnArr[3]() ); //10
答:
方法一
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[n] = function() {
return n } }())}
console.log(fnArr[3]())
- 使用闭包封装一个汽车对象,可以通过如下方式获取汽车状态
var Car = (function() {
var speed = 0;
function accelerate() {
speed += 10;
}
function decelerate() {
speed -= 10;
}
function getSpeed() {
console.log(speed);
return speed;
}
function getStatus() {
if (speed > 0) {
console.log('running');
}else {
console.log('stop');
}
}
function setSpeed(i) {
speed = i;
}
return {
accelerate: accelerate,
decelerate: decelerate,
getSpeed: getSpeed,
getStatus: getStatus,
setSpeed: setSpeed
};
}());
- 写一个函数使用setTimeout模拟setInterval的功能
var i = 0
function intv() {
setTimeout(function() {
console.log(i++)
intv()
}, 1000)
}
- 写一个函数,计算setTimeout平均[备注:新加]最小时间粒度
function getmin(){
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)
}
getmin()
下面这段代码输出结果是? 为什么?
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是在执行完其他代码之后再执行,所以在执行完第一句之后,就到了下面的while循环,flag为true,为死循环,执行空语句,无输出。
*下面这段代码输出?如何输出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(五次)。
for (var i = 0; i < 5; i++) {
setTimeout((function(num) {
return function() {
return console.log('delayer: ' + num) }
}(i)),0)
console.log(i)}