为啥这个变量没有在 setTimeout 函数中设置?
Posted
技术标签:
【中文标题】为啥这个变量没有在 setTimeout 函数中设置?【英文标题】:Why does this variable not set in a setTimeout function?为什么这个变量没有在 setTimeout 函数中设置? 【发布时间】:2011-09-15 06:33:30 【问题描述】:我有一个基本的文本区域:
<textarea id='text_comment'></div>
我有这个功能:
$('#text_comment').live('keypress', function()
setTimeout(function()
string = $(this).val();
alert(string);
, 500);
);
它应该提醒文本区域中的值,但它什么也不提醒。
我希望它在 500 毫秒后获取 textarea 的值,但如果它在 setTimeout
函数内部,它似乎不会设置变量。
【问题讨论】:
你正在用div
关闭textarea
【参考方案1】:
上下文变成window
的,因为setTimeout
是window
的一个方法。
$('#text_comment').live('keypress', function()
var el = this;
setTimeout(function()
var string = $(el).val();
alert(string);
, 500);
);
如果您以这种方式保存对 el 的引用,则可以依赖它而不是 this
而且,您可以只使用el.value
,因为无需将其包装在 jQuery 中并在内部由.val()
执行完全相同的操作
【讨论】:
太棒了!感谢您的快速回复。当它让我接受时会接受【参考方案2】:this
的值在传递给 setTimeout 的函数内部发生变化。这样做:
$('#text_comment').live('keypress', function()
var self = this
setTimeout(function()
string = $(self).val();
alert(string);
, 500);
);
【讨论】:
也谢谢你,你的回答很棒【参考方案3】:this
的值取决于当前函数的调用方式。传递给setTimeout
的函数与事件处理函数不同,所以this
的值不同。
先复制this
。
$('#text_comment').live('keypress', function()
var that = this;
setTimeout(function()
string = $(that).val();
alert(string);
, 500);
);
【讨论】:
【参考方案4】:因为回调不是在keypress
事件的范围内运行,而是在window
的全局范围内运行。
复制对局部变量的引用,使其包含在闭包中:
$('#text_comment').live('keypress', function()
var element = this;
window.setTimeout(function()
var string = $(element).val();
alert(string);
, 500);
);
【讨论】:
【参考方案5】:当 'keypress' 事件被触发时,函数中this
的值将是textarea
对象。但是当setTimeout
中的函数运行时(500毫秒后),this
的值已经变成了别的东西(可能是window
对象)
将您的代码更改为:
$('#text_comment').live('keypress', function()
var textarea = this;
setTimeout(function()
string = $(textarea).val();
alert(string);
, 500);
);
【讨论】:
以上是关于为啥这个变量没有在 setTimeout 函数中设置?的主要内容,如果未能解决你的问题,请参考以下文章
在js对象的方法里有setTimeout函数,在setTimeout里怎么调用该对象方法,用this没有用