实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出
function count(start, end) {
let num = start;
let obj = {};
console.log(num) // 就是这段
obj.timer = setInterval(() => {
if (num < end) console.log(num+=1);
else obj.cancel();
}, 100);
obj.cancel = function () {
clearInterval(obj.timer);
};
return obj;
} 前面那些用setTimeout的大兄弟都不能通过use strict严格模式。玩玩没问题,用于实际生产要出大问题。
当然使用setInterval没基本毛病:
'use strict'
function count(start, end) {
console.log(start++);
let timer = setInterval(() => {
if (start > end) {
clearInterval(timer);
} else {
console.log(start++);
}
}, 100);
return {
cancel: () => {
clearInterval(timer);
}
};
} 说回来用setTimeout在控制台跑没毛病,到了牛客这儿就不行了。
'use strict'
function count(start, end) {
if (start <= end) {
console.log(start++)
};
let timer = setTimeout(() => count(start, end), 100);// 这句放进if后面的代码块就能行得通
return {
cancel: ()=> {
clearTimeout(timer)
}
};
}
var obj = new count(1, 5);
obj.cancel;
/*()=> {
clearTimeout(timer)
}
*/
function count(start, end) {
console.log(start++);
let timer = setInterval(function() {
if(start <= end) {
console.log(start++);
}else{
clearInterval(timer);
}
},100);
return {
cancel:function() {
clearInterval(timer);
}
}
} 方法二: function count(start, end) {
if(start <= end) {
console.log(start++);
item = setTimeout(function(){
count(start,end)
},100);
}
return {
cancel: function(){clearTimeout(item);}
}
} function count(start, end) {
var num = start
console.log(num)
var timer = setInterval(() => {
console.log(++num)
if(num >= end) {
cancel()
}
}, 100)
function cancel() {
clearTimeout(timer)
}
return { cancel }
}
function count(start, end) { //立即输出第一个值 console.log(start++); var timer = setInterval(function(){ if(start <= end){ console.log(start++); }else{ clearInterval(timer); } },100); //返回一个对象 return { cancel : function(){ clearInterval(timer); } }; }