setTimeout
和 setInterval
由于 JavaScript 是异步的,可以使用 setTimeout
和 setInterval
来计划执行函数。
注意: 定时处理不是 ECMAScript 的标准,它们在 DOM (文档对象模型) 被实现。
function foo() {}
var id = setTimeout(foo, 1000); // 返回一个大于零的数字
当 setTimeout
被调用时,它会返回一个 ID 标识并且计划在将来大约 1000 毫秒后调用 foo
函数。
foo
函数只会被执行一次。
基于 JavaScript 引擎的计时策略,以及本质上的单线程运行方式,所以其它代码的运行可能会阻塞此线程。
因此没法确保函数会在 setTimeout
指定的时刻被调用。
作为第一个参数的函数将会在全局作用域中执行,因此函数内的 this
将会指向这个全局对象。
function Foo() {
this.value = 42;
this.method = function() {
// this 指向全局对象
console.log(this.value); // 输出:undefined
};
setTimeout(this.method, 500);
}
new Foo();
注意: setTimeout
的第一个参数是函数对象,一个常犯的错误是这样的 setTimeout(foo(), 1000)
,
这里回调函数是 foo
的返回值,而不是foo
本身。
大部分情况下,这是一个潜在的错误,因为如果函数返回 undefined
,setTimeout
也不会报错。
setInterval
的堆调用
setTimeout
只会执行回调函数一次,不过 setInterval
- 正如名字建议的 - 会每隔 X
毫秒执行函数一次。
但是却不鼓励使用这个函数。
当回调函数的执行被阻塞时,setInterval
仍然会发布更多的毁掉指令。在很小的定时间隔情况下,这会导致回调函数被堆积起来。
function foo(){
// 阻塞执行 1 秒
}
setInterval(foo, 100);
上面代码中,foo
会执行一次随后被阻塞了一分钟。
在 foo
被阻塞的时候,setInterval
仍然在组织将来对回调函数的调用。
因此,当第一次 foo
函数调用结束时,已经有 10 次函数调用在等待执行。
处理可能的阻塞调用
最简单也是最容易控制的方案,是在回调函数内部使用 setTimeout
函数。
function foo(){
// 阻塞执行 1 秒
setTimeout(foo, 100);
}
foo();
这样不仅封装了 setTimeout
回调函数,而且阻止了调用指令的堆积,可以有更多的控制。
foo
函数现在可以控制是否继续执行还是终止执行。
手工清空定时器
可以通过将定时时产生的 ID 标识传递给 clearTimeout
或者 clearInterval
函数来清除定时,
至于使用哪个函数取决于调用的时候使用的是 setTimeout
还是 setInterval
。
var id = setTimeout(foo, 1000);
clearTimeout(id);
清除所有定时器
由于没有内置的清除所有定时器的方法,可以采用一种暴力的方式来达到这一目的。
// 清空"所有"的定时器
for(var i = 1; i < 1000; i++) {
clearTimeout(i);
}
可能还有些定时器不会在上面代码中被清除(译者注:如果定时器调用时返回的 ID 值大于 1000),
因此我们可以事先保存所有的定时器 ID,然后一把清除。
隐藏使用 eval
setTimeout
和 setInterval
也接受第一个参数为字符串的情况。
这个特性绝对不要使用,因为它在内部使用了 eval
。
注意: 由于定时器函数不是 ECMAScript 的标准,如何解析字符串参数在不同的 JavaScript 引擎实现中可能不同。
事实上,微软的 JScript 会使用 Function
构造函数来代替 eval
的使用。
function foo() {
// 将会被调用
}
function bar() {
function foo() {
// 不会被调用
}
setTimeout('foo()', 1000);
}
bar();
由于 eval
在这种情况下不是被直接调用,因此传递到 setTimeout
的字符串会自全局作用域中执行;
因此,上面的回调函数使用的不是定义在 bar
作用域中的局部变量 foo
。
建议不要在调用定时器函数时,为了向回调函数传递参数而使用字符串的形式。
function foo(a, b, c) {}
// 不要这样做
setTimeout('foo(1,2, 3)', 1000)
// 可以使用匿名函数完成相同功能
setTimeout(function() {
foo(a, b, c);
}, 1000)
注意: 虽然也可以使用这样的语法 setTimeout(foo, 1000, a, b, c)
,
但是不推荐这么做,因为在使用对象的属性方法时可能会出错。
(译者注:这里说的是属性方法内,this
的指向错误)
结论
绝对不要使用字符串作为 setTimeout
或者 setInterval
的第一个参数,
这么写的代码明显质量很差。当需要向回调函数传递参数时,可以创建一个匿名函数,在函数内执行真实的回调函数。
另外,应该避免使用 setInterval
,因为它的定时执行不会被 JavaScript 阻塞。
相关推荐
在JavaScript编程中,`setTimeout()`和`setInterval()`是两个非常关键的函数,它们用于实现异步编程,特别是在处理动画、定时任务或者延迟执行代码时不可或缺。这两个函数都是全局对象`window`的方法,它们的区别...
Javascript的setTimeOut和setInterval函数应用非常广泛,它们都用来处理延时和定时任务,比如打开网页一段时间后弹出一个登录框,页面每隔一段时间发送异步请求获取最新数据等等。但它们的应用是有区别的。 ...
JavaScript 中 setTimeout 和 setInterval 函数的传参及调用 在 JavaScript 中,setTimeout 和 setInterval 函数都是用于在指定的时间点执行某个函数的,但是它们的传参方式和调用方式却有所不同。 setTimeout ...
使用SetInterval和设定延时函数setTimeout 很类似。setTimeout 运用在延迟一段时间,再进行某项操作。
在这个主题中,我们将深入探讨`setTimeout`和`setInterval`这两个核心定时器函数,它们在JavaScript中的应用以及它们之间的区别。 首先,`setTimeout`函数用于在指定的毫秒数后调用一个函数或执行一段代码。它的...
`timercpp` 是一个C++库,它的主要目的是为C++开发者提供类似于JavaScript中的`setTimeout`和`setInterval`这两个函数的功能。在JavaScript中,`setTimeout`用于在指定的时间后执行一次回调函数,而`setInterval`则...
在JavaScript中,setTimeout和setInterval是两个基本的定时器函数,用于实现延迟执行或循环执行某个函数。然而,这两个函数在执行时往往和我们设置的延迟时间有出入。本文将深入探讨JS定时器的执行机制,分析why ...
JavaScript中的定时器函数setTimeout和setInterval都用于延迟执行代码,但它们的工作方式和用法有所不同。以下是关于这两个函数的详细解析: 1. setTimeout函数的基本概念和用法: setTimeout是JavaScript中的一个...
在JavaScript中,setTimeout和setInterval是两种常见的定时器函数,用于实现异步操作。JavaScript作为单线程语言,其主线程的执行是顺序的,但是在处理某些操作,如延时任务或者周期任务时,会借助事件循环机制和回...
在JavaScript编程中,`setTimeout`与`setInterval`是两个非常常用的函数,用于控制代码执行的时间间隔。虽然它们在功能上有一定的相似性,但其实现的效果却大不相同。下面我们将详细探讨这两个函数的工作原理、用法...
在JavaScript中,`setTimeout`和`setInterval`是两个非常重要的定时器函数,它们用于在指定的时间后执行特定的函数。然而,`setInterval`在某些情况下可能不如我们期望的那样工作,因为它会周期性地不间断执行,即使...
04-setTimeout.html
setTimeout和setInterval是JavaScript中两个基本的定时器函数,它们在前端开发中有着广泛的应用。本文将详细介绍这两个函数的使用方法、差异、以及如何在实际项目中有效利用它们。 setTimeout和setInterval是...
本文将详细介绍如何在 C# 中实现类似 JavaScript 的 `setTimeout` 和 `setInterval` 功能,并提供具体的实现代码和注意事项。 #### SetTimeout函数详解 `SetTimeout` 函数的主要作用是在指定的时间间隔后执行一次...
在JavaScript中,定时执行任务是通过`setTimeout`和`setInterval`这两个函数来实现的。它们都是用于在指定延迟后执行代码,但它们之间存在显著的区别。 `setTimeout`函数用于在给定的`DelayTime`(延迟时间)过后...
JavaScript中的`setTimeout`和`setInterval`是两个重要的定时器函数,它们都属于全局`window`对象的方法,常用于在指定的时间后执行某段代码或周期性地重复执行某段代码。然而,它们的工作机制和用途有所不同。 1. ...
在JavaScript编程中,setTimeout和setInterval是用于控制代码在一定时间后执行或定期重复执行的两个非常有用的函数。这两个函数都是JavaScript的全局函数,可以在浏览器环境中直接使用,也可以在Node.js中使用。 ##...
在JavaScript编程中,我们经常需要处理时间延迟或周期性任务执行的需求,这时会用到setTimeout和setInterval这两个全局函数。 setTimeout函数用于在指定的毫秒数后执行一次代码块,而setInterval则用于每隔指定的...
unref()和ref()用法非常的简单,就是取消和回复setTimeout和...//取消setTimeout和setInterval函數的調用 timer.ref();//恢復setTimeout和setInterval函數的調用 是不是超级简单,如果还不明白,请放过javascript吧