JavaScript setTimeout 中 this 指向问题与参数传递详解

作者:小括号时间:2026-10-27 13:34:52浏览:256

本文深入解析JavaScript中setTimeout函数的this指向问题,指出默认情况下this指向window对象。文章提供了保存this引用和使用jQuery.proxy两种解决方案,并详细演示了如何向setTimeout回调函数安全传递任意类型参数,包括字符串和复杂对象,附带实际代码示例。

一、 setTimeout this指向问题

setTimeout this指向问题

在表达式 setTimeout("this.count()",1000) 中,内部的 this 关键字实际上指向的是全局 window 对象,而非预期的当前执行上下文对象。


JavaScript 规范中对于 setTimeout 函数的定义如下所示。


具体实现代码参考如下:

 
window.setTimeout=function(vCode, iMilliSeconds [, sLanguage]){
//.....代码
return timer//返回一个标记符
} 

因此,当直接向 setTimeout() 方法传入 this 时,其值必然指向所属的当前对象 window。


向setTimeout传入参数

针对此问题,常见的解决方法包括以下两种:


1、在调用 setTimeout 之前先保存 this 的引用,例如定义 self=this; 然后执行 setTimeout("self.count()", 1000);


2、利用 jQuery 的 $.proxy 方法改变 this 的指向,例如使用 $.proxy(setTimeout("this.count()"), this);


二、向setTimeout传入参数

相关代码示例如下:

 
function init(){
var url = "<%=basePath%>fetchwater.do?method=searchRealWater&xzqh=" + "<%=xzqh%>" + "&rand="+Math.random();
//alert(url);
window.setTimeout(function(){ searchJDWater(url);},100);
} 

经过实际测试,可以向 setTimeout 传入任意参数,无论是 string 类型还是其他类型均可正常运作,只是在处理 this 时需要采用上述解决方案。


此处附上一个关于向 setTimeout 传参方法的更详细链接:https://www.jb51.net/article/40524.htm

作者最新文章