首页 > 试题广场 >

计时器

[编程题]计时器
  • 热度指数:129209 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出
推荐
setInterval() 方***按照指定周期不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。注意第一个数需要立即输出即可。
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);
         }
     };
 } 

编辑于 2015-08-18 21:01:11 回复(38)
function count (start, end) {
	var timer = null;
	console.log(start);
	timer = setInterval(function () {
		if(start< end){
			console.log(++start);
		}
	},100);
	return {
		cancel: function  () {
			clearInterval(timer);
		}
	} 
}

发表于 2015-09-07 09:18:32 回复(4)
function count(start, end) {
    console.log(start++);//第一个数需要立即输出
    //setInterval(code,millisec,lang)
    //参数1:必需。要调用的函数或要执行的代码串
    //参数2:必须。周期性执行或调用 code 之间的时间间隔,以毫秒计
    //参数3:可选。
    var time = setInterval(function(){
        if(start <= end){
            console.log(start++);
        }else{
             clearInterval(time);
        }
    },100);
    return {
        cancel:function(){
            clearInterval(time);
        }
    }
}
//注:setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式。
//方***不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。
//setTimeout() :在指定的毫秒数后调用函数或计算表达式,写法和setInterval()一样

编辑于 2019-09-11 17:44:50 回复(0)
setTimeout和setInterval的语法相同。它们都有两个参数,一个是将要执行的代码字符串,还有一个是以毫秒为单位的时间间隔,当过了那个时间段之后就将执行那段代码。
不过这两个函数还是有区别的,setInterval在执行完一次代码之后,经过了那个固定的时间间隔,它还会自动重复执行代码,而setTimeout只执行一次那段代码。
区别:
window.setTimeout("function",time);//设置一个超时对象,只执行一次,无周期 
window.setInterval("function",time);//设置一个超时对象,周期='交互时间'
停止定时: 
window.clearTimeout(对象) 清除已设置的setTimeout对象
window.clearInterval(对象) 清除已设置的setInterval对象 
发表于 2016-10-09 19:39:17 回复(0)
看到第一个人做的,里面出现小于等于,这时候控制台会多出一个数据,出现错误
如图
当取消掉=-后则全部通过

正确答案:
function count(start, end) {
    console.log(start)
    var dingshi = setInterval(function () {
        if (start < end) {
            console.log(start += 1)
        }
    }, 100)
    return { cancel: function () { clearInterval(dingshi)} }
}

发表于 2018-01-16 19:00:46 回复(4)
/*
实现一个打点计时器,要求
1、从 start 到 end(包含 start 和 end),每隔 100 毫秒 console.log 一个数字,每次数字增幅为 1
2、返回的对象中需要包含一个 cancel 方法,用于停止定时操作
3、第一个数需要立即输出
*/
function count(start, end) {
	//第一个数立即输出
	console.log(start++);
	//利用setInterval方法计算间隔多长时间输出一个数字
	var timer = setInterval(function(){
		if (start <= end) {
			console.log(start++);
		}
		else{
			clearInterval(timer);
		}
	}, 100);
	//返回一个对象,其中包含cancel方法
	return {
		cancel:function(){
			clearInterval(timer);
		}
	};
}
console.log(count(2,10));

发表于 2017-02-13 22:41:33 回复(1)
function count(start, end) {
    console.log(start);
	var Timer = setInterval(function(){
        console.log(++start);
        if(start===end){
            cancel();
        }
    },100);
    var cancel = function(){
        clearInterval(Timer);
    }
    var obj = {
        "cancel":cancel
    };
    
    return obj;
}

测试通过!

发表于 2017-04-10 14:51:11 回复(1)
方法一:
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);}
    }
}



发表于 2022-03-26 18:29:01 回复(0)
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);
        }
    };
}

发表于 2022-01-06 16:40:09 回复(0)
    function count(start, end) {
      console.log(start++)
      const id = setInterval(() => {
      start <= end ? console.log(start++): '' },100)
      return {cancel() {clearInterval(id)}}
    }
可以参考一下
发表于 2020-03-15 00:14:05 回复(0)
function count(start, end) {
    console.log(start);
    var i = start+1;
    var timer = null;
    timer = setInterval(function (){
        if(i<=end){
            console.log(i);
            i = i + 1;
        }
    }, 100);
    
    return obj = {
        cancel: function (){
            clearInterval(timer);
        }
    }
}

发表于 2019-11-04 20:47:46 回复(0)
  1.     console.log(start)  
  2.     var timer = setInterval(  
  3.         function(){  
  4.             if(start<end) console.log(start+=1);  
  5.         },100)  
  6.     return {cancel:function(){clearInterval(timer)}}  
  7. //setInterval()方法
发表于 2017-08-14 11:00:25 回复(0)
var timer = null;
    console.log(start);  
    var obj = {
        timer:setInterval(function(){
            if(start<end){                
                start++;     
                console.log(start);           
            }else{
                clearInterval(this.timer);
            }
        },100),
        cancel:function(){
          clearInterval(this.timer);
        }
    }
    return obj;
发表于 2016-11-18 10:18:53 回复(0)
    function count(start, end) {
            var f = function () {
                if (start <= end)
                    console.log(start++);
                else {
                    clearInterval(int);
                }
            };
            f(); // 立即执行
            var int = setInterval(f, 1000);
            return {
                cancel: function () {
                    clearInterval(int);
                }
            }
        }

编辑于 2016-11-15 21:11:54 回复(0)
为啥返回函数都要用json形式
发表于 2015-08-27 21:51:43 回复(4)
function count(start, end) {
	if(start <= end){
		console.log(start);
		start++;
		st = setTimeout(function(){count(start, end)}, 100);
	}
	return {
	    cancel: function(){clearTimeout(st);}
	}
}

非要返回对象,被坑死了
编辑于 2015-09-01 12:50:32 回复(15)

一、通过setInterval()方法   【出自 @希留】

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);
         }
     };
 }

二、通过setTimeout()方法【出自 @shawnan】

function count(start, end) {
    if(start <= end){
        console.log(start);
        start++;
        st = setTimeout(function(){count(start, end)}, 100);
    }
    return {
        cancel: function(){clearTimeout(st);}
    }
}
注意:两个方法的第一个参数可以是字符串,也可以是函数 
(1)如果是字符串  则参数是  要执行的javascript代码串(加双引号),  作普通javascript语句执行即可  和eval()差不多,执行的环境是全局,所以不能访问函数作用域的变量。
(2)如果是函数(有括弧),则参数是该函数  (不加双引号) 的返回值,即真正执行的是其返回值,作用是【数值传递】。若返回值是另一个函数对象X,则执行的是函数X里的内容;若函数没定义返回值时值为undefined,或返回值为非函数对象,则无任何执行操作。
(3)如果是函数名(无括弧),则参数是该函数对象  (不加双引号) 本身,即真正执行的就是函数中的语句,且与返回值无关,作用是【函数调用】。通过"function() { xxx(argv); }"还能访问该函数作用域链上的变量。

http://wayne173.iteye.com/blog/1907530

编辑于 2017-06-19 19:12:24 回复(8)
返回函数的用法:
var t=count(1,20);
t.cancel();

发表于 2016-03-31 11:04:27 回复(0)
// 有个疑问,函数里面定义var st会不通过

function count(start, end) {
    if (start <= end) {
        console.log(start++);
        
        st = setTimeout(function() {
            count(start, end);
        }, 100);
    }
     
    return {
        cancel: function() {
            clearTimeout(st);
        }
    }
}

编辑于 2017-02-14 23:08:37 回复(8)
 cancel : function (){
                    clearInterval(id);
                 }这种方式是定义方法吗?
发表于 2024-05-19 20:59:47 回复(0)
//修改后
function count(start, end) {            if(start<=end){          console.log(start);          start++;           t= setTimeout(function(){count(start,end)},100)          }     return {         cancel:function (){         clearTimeout(t);     }     }     }
//修改前
function count(start, end) {            if(start<=end){          console.log(start);          start++;          var t= setTimeout(count(start,end),100)          }     return {         cancel:function (){         clearTimeout(t);     }     }    
}
各位大佬我想问问为什么 加了var 和去掉匿名函数的声明就不行通过了呢
发表于 2018-06-20 16:30:54 回复(3)