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 毫秒是一秒。

  1. <!-- 如下:每三秒打印一句hello出来 -->
  2. <body>
  3. <script>
  4. setInterval(function(){console.log("Hello")},3000);
  5. </script>
  6. </body>
  1. <!-- 如下:每三秒打印一句hello出来 -->
  2. <body>
  3. <script>
  4. setInterval(function(){loghello()},3000);
  5. function loghello(){
  6. console.log("hello");
  7. }
  8. </script>
  9. </body>

clearInterval() 方法用于停止 setInterval() 方法执行的函数代码。

  1. <!-- 如下:每1秒打印一次当前时间,添加了停止打印按钮 -->
  2. <body>
  3. <script>
  4. var timer = setInterval(function(){
  5. document.getElementById("timeNow").innerHTML = new Date().toLocaleTimeString();
  6. },1000);
  7. function stop(){
  8. clearInterval(timer);
  9. }
  10. </script>
  11. <div>
  12. <p id="timeNow"></p>
  13. <button onclick="stop()">停止</button>
  14. </div>
  15. </body>

3、setTimeout() 方法

语法

myVar= window.setTimeout(“javascript function”, milliseconds);
setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 myVar 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。
setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 “alert(‘5 seconds!’)”,或者对函数的调用,诸如 alertMsg。
第二个参数指示从当前起多少毫秒后执行第一个参数。
提示:1000 毫秒等于一秒。

  1. <!-- 如下:等待五秒后打印一句hello出来 -->
  2. <body>
  3. <script>
  4. setTimeout(function(){console.log("Hello")},5000);
  5. </script>
  6. </body>

clearTimeout() 方法用于停止执行setTimeout()方法的函数代码。

window.clearTimeout(timeoutVariable)
window.clearTimeout() 方法可以不使用window 前缀。
要使用clearTimeout() 方法, 你必须在创建超时方法中(setTimeout)使用全局变量:
myVar=setTimeout(“javascript function”,milliseconds);
如果函数还未被执行,你可以使用 clearTimeout() 方法来停止执行函数代码。

  1. <!-- 如下:等待五秒后打印一句hello出来,添加取消按钮在未执行打印前点取消延迟执行。 -->
  2. <body>
  3. <div>
  4. <p id="timeNow"></p>
  5. <button onclick="cancle()">取消</button>
  6. </div>
  7. <script>
  8. document.getElementById("timeNow").innerHTML = "等待到时执行...";
  9. var timer = setTimeout(function(){
  10. document.getElementById("timeNow").innerHTML = "已执行...";
  11. },5000);
  12. function cancle(){
  13. document.getElementById("timeNow").innerHTML = "已取消...";
  14. clearTimeout(timer);
  15. }
  16. </script>
  17. </body>

注意,在js中,普通函数中的this一般指向于运行时所在的对象,而setTimeout中的this默认是指向的window,如下:

  1. <body>
  2. <span id="span1">span1</span>
  3. <span id="span2">span2</span>
  4. <script>
  5. var span1 = document.getElementById("span1");
  6. var span2 = document.getElementById("span2");
  7. var userName = "全局userName";
  8. var timer = setTimeout(function(){
  9. span1.innerHTML = this.userName;
  10. },3000);
  11. var user = {
  12. userName:'对象里的userName',
  13. getUserNmae(){
  14. var that = this;
  15. setTimeout(function(){
  16. span2.innerHTML = that.userName;
  17. },3000);
  18. }
  19. };
  20. user.getUserNmae();
  21. </script>
  22. </body>

上面的代码中用了that来指向上一层的this,如果不想用that的话可以用箭头函数,因为箭头函数中的this是指向定义时的上一层作用域中的this,如下:

  1. <body>
  2. <span id="span1">span1</span>
  3. <span id="span2">span2</span>
  4. <script>
  5. var span1 = document.getElementById("span1");
  6. var span2 = document.getElementById("span2");
  7. var userName = "全局userName";
  8. var timer = setTimeout(() => {
  9. span1.innerHTML = this.userName;
  10. },3000);
  11. var user = {
  12. userName:'对象里的userName',
  13. getUserNmae(){
  14. setTimeout(() => {
  15. span2.innerHTML = this.userName;
  16. },3000);
  17. },
  18. getUserName1(){
  19. console.log('getUserName1:'+this.userName);
  20. }
  21. };
  22. user.getUserNmae();
  23. user.getUserName1();
  24. </script>
  25. </body>