我有一个需要$(this)
解析它的函数。它位于each
循环内。这按预期工作。当我与$(this)
setTimeout()
时出现此问题
DEMO http://jsfiddle.net/6e937r1b/2/
为了简化和展示我的问题,我已经把一个基本的小提琴放在一起。您会注意到文本未输出。
$("li").each(function(i) {
/* below example outputs value if i only */
setTimeout(function() {
alertThis($(this).text() + i);
}, 1000 * i);
/* below example works as you'd expect outputting the text and value of i */
alertThis($(this).text() + i + ' outside of timeout');
});
function alertThis(text)
{
alert(text);
}
答案 0 :(得分:3)
如果范围发生变化,您需要捕获this
:
$("li").each(function(i) {
var target = $(this);
setTimeout(function() {
alertThis(target.text() + i);
}, 1000 * i);
alertThis(target.text() + i + ' outside of timeout');
});
答案 1 :(得分:1)
那是因为this
在setTimeout()
内失去了背景。简而言之,this
引用setTimeout()
内部的全局对象,因为你已经改变了范围。处理此问题的典型方法是将this
的上下文存储在变量中(通常为that
):
var that = $(this);
答案 2 :(得分:0)
传递给each
的函数接收第二个参数,即dom元素本身。你可以简单地使用它:
$("li").each(function(i, el) {
setTimeout(function() {
alertThis($(el).text() + i);
}, 1000 * i);
alertThis($(el).text() + i + ' outside of timeout');
});