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>