setTimeout 深度剖析

本文详细探讨了JavaScript中的setTimeout函数,包括其基础用法、传参方式、this上下文问题以及执行间隔的原理。特别强调了在回调函数中this的指向问题,提出了使用匿名函数或bind方法避免this丢失的解决方案。此外,还讨论了setTimeout的运行机制,解释了setTimeout(func, 0)的实际作用,即尽可能早地执行指定任务,但仍然需要等待当前任务和任务队列执行完毕。最后,介绍了setTimeout在调整事件顺序和分割耗时任务中的应用,以及前端开发者如何利用setTimeout优化代码和提升性能。" 115863521,7444302,PAC1954/PAC1934电源监测芯片详解及应用,"['嵌入式硬件', '单片机', 'c1']
摘要由CSDN通过智能技术生成
  • 如何使用 setTimeout

setTimeout() 基础

===============

setTimeout 函数用来指定某个函数或某段代码,在多少毫秒之后执行。它返回一个整数,表示定时器的编号,以后可以用来取消这个定时器。

var timerId = setTimeout(func|code, delay)

上面代码中,setTimeout 函数接受两个参数,第一个参数 func|code 是将要推迟执行的函数名或者一段代码,第二个参数 delay 是推迟执行的毫秒数。

console.log(1);

setTimeout(‘console.log(2)’,1000);

console.log(3);

上面代码的输出结果就是1,3,2,因为 setTimeout 指定第二行语句推迟 1000 毫秒再执行(如果这在 Sublime 下运用插件以 nodejs 环境来执行,许解释器不同,会报错)。

需要注意的是,推迟执行的代码必须以字符串的形式,放入 setTimeout,因为引擎内部使用 eval 函数,将字符串转为代码。如果推迟执行的是函数,则可以直接将函数名,放入 setTimeout。一方面 eval 函数有安全顾虑,另一方面为了便于 JavaScript 引擎优化代码,setTimeout 方法一般总是采用函数名的形式,就像下面这样。

function func(){

console.log(2);

}

setTimeout(func,1000);

// 或者

setTimeout(function (){console.log(2)},1000);

setTimeout 传参数


除了前两个参数,setTimeout 还允许添加更多的参数。它们将被传入推迟执行的函数(回调函数)。

setTimeout(function(a,b){

console.log(a+b);

},1000,1,1);

上面代码中,setTimeout 共有 4 个参数。最后那两个参数,将在 1000 毫秒之后回调函数执行时,作为回调函数的参数。

IE 9.0 及以下版本,只允许 setTimeout 有两个参数,不支持更多的参数;可以在匿名函数中,让回调函数带参数运行,再把匿名函数输入 setTimeout;例如:

setTimeout(function() {

myFunc(“one”, “two”, “three”);

}, 1000);

当然也可以使用 bindapply 方法来解决。

例如使用 bind 方法,把多余的参数绑定在回调函数上面,生成一个新的函数输入 setTimeout。

setTimeout( function(arg1){}.bind(undefined, 10), 1000 );

上面代码中,bind 方法第一个参数是 undefined,表示将原函数的 this 绑定全局作用域,第二个参数是要传入原函数的参数。它运行后会返回一个新函数,该函数不带参数。

setTimeout 注意点


setTimeout() 中回调函数中的 this

如果被 setTimeout 推迟执行的回调函数是某个对象的方法,那么该方法中的 this 关键字将指向全局环境,而不是定义时所在的那个对象。

var x = 1;

var o = {

x: 2,

y: function(){

console.log(this.x);

}

};

setTimeout(o.y,1000);// 1

上面代码输出的是 1,而不是 2,这表示 o.y 的 this 所指向的已经不是 o,而是全局环境了。

再看一个不容易发现错误的例子。

function User(login) {

<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值