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