1、JavaScript 两种计时方式
通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。
在 JavaScritp 中使用计时事件是很容易的,两个关键方法是:
- setInterval() - 间隔指定的毫秒数不停地执行指定的代码。
- setTimeout() - 在指定的毫秒数后执行指定代码,这个是仅执行一次的。
注意: setInterval() 和 setTimeout() 是 HTML DOM Window对象的两个方法,是异步执行的,不会阻塞等待。
2、setInterval() 方法
语法
window.setInterval(“javascript function”,milliseconds);
window.setInterval() 方法可以不使用 window 前缀,直接使用函数 setInterval()。
setInterval() 第一个参数是函数(function)。
第二个参数间隔的毫秒数
注意: 1000 毫秒是一秒。
<!-- 如下:每三秒打印一句hello出来 --><body><script>setInterval(function(){console.log("Hello")},3000);</script></body>
<!-- 如下:每三秒打印一句hello出来 --><body><script>setInterval(function(){loghello()},3000);function loghello(){console.log("hello");}</script></body>
clearInterval() 方法用于停止 setInterval() 方法执行的函数代码。
<!-- 如下:每1秒打印一次当前时间,添加了停止打印按钮 --><body><script>var timer = setInterval(function(){document.getElementById("timeNow").innerHTML = new Date().toLocaleTimeString();},1000);function stop(){clearInterval(timer);}</script><div><p id="timeNow"></p><button onclick="stop()">停止</button></div></body>
3、setTimeout() 方法
语法
myVar= window.setTimeout(“javascript function”, milliseconds);
setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 myVar 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。
setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 “alert(‘5 seconds!’)”,或者对函数的调用,诸如 alertMsg。
第二个参数指示从当前起多少毫秒后执行第一个参数。
提示:1000 毫秒等于一秒。
<!-- 如下:等待五秒后打印一句hello出来 --><body><script>setTimeout(function(){console.log("Hello")},5000);</script></body>
clearTimeout() 方法用于停止执行setTimeout()方法的函数代码。
window.clearTimeout(timeoutVariable)
window.clearTimeout() 方法可以不使用window 前缀。
要使用clearTimeout() 方法, 你必须在创建超时方法中(setTimeout)使用全局变量:
myVar=setTimeout(“javascript function”,milliseconds);
如果函数还未被执行,你可以使用 clearTimeout() 方法来停止执行函数代码。
<!-- 如下:等待五秒后打印一句hello出来,添加取消按钮在未执行打印前点取消延迟执行。 --><body><div><p id="timeNow"></p><button onclick="cancle()">取消</button></div><script>document.getElementById("timeNow").innerHTML = "等待到时执行...";var timer = setTimeout(function(){document.getElementById("timeNow").innerHTML = "已执行...";},5000);function cancle(){document.getElementById("timeNow").innerHTML = "已取消...";clearTimeout(timer);}</script></body>
注意,在js中,普通函数中的this一般指向于运行时所在的对象,而setTimeout中的this默认是指向的window,如下:
<body><span id="span1">span1</span><span id="span2">span2</span><script>var span1 = document.getElementById("span1");var span2 = document.getElementById("span2");var userName = "全局userName";var timer = setTimeout(function(){span1.innerHTML = this.userName;},3000);var user = {userName:'对象里的userName',getUserNmae(){var that = this;setTimeout(function(){span2.innerHTML = that.userName;},3000);}};user.getUserNmae();</script></body>
上面的代码中用了that来指向上一层的this,如果不想用that的话可以用箭头函数,因为箭头函数中的this是指向定义时的上一层作用域中的this,如下:
<body><span id="span1">span1</span><span id="span2">span2</span><script>var span1 = document.getElementById("span1");var span2 = document.getElementById("span2");var userName = "全局userName";var timer = setTimeout(() => {span1.innerHTML = this.userName;},3000);var user = {userName:'对象里的userName',getUserNmae(){setTimeout(() => {span2.innerHTML = this.userName;},3000);},getUserName1(){console.log('getUserName1:'+this.userName);}};user.getUserNmae();user.getUserName1();</script></body>
