Javascript 正在分析$(this)以在setTimeout内运行
我有一个函数,需要解析Javascript 正在分析$(this)以在setTimeout内运行,javascript,jquery,Javascript,Jquery,我有一个函数,需要解析$(this)。它位于每个循环中。这正如预期的那样有效。当我与setTimeout()一起使用时,需要访问$(this),问题就会出现 演示 为了简化和证明我的问题,我把一把基本的小提琴放在一起。您会注意到文本没有输出 $("li").each(function(i) { /* below example outputs value if i only */ setTimeout(function() { alertThis($(this).
$(this)
。它位于每个循环中。这正如预期的那样有效。当我与setTimeout()一起使用时,需要访问$(this)
,问题就会出现
演示
为了简化和证明我的问题,我把一把基本的小提琴放在一起。您会注意到文本没有输出
$("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);
}
与往常一样,如果范围发生变化,您需要捕获此
:
$("li").each(function(i) {
var target = $(this);
setTimeout(function() {
alertThis(target.text() + i);
}, 1000 * i);
alertThis(target.text() + i + ' outside of timeout');
});
与往常一样,如果范围发生变化,您需要捕获此
:
$("li").each(function(i) {
var target = $(this);
setTimeout(function() {
alertThis(target.text() + i);
}, 1000 * i);
alertThis(target.text() + i + ' outside of timeout');
});
这是因为
此
会丢失setTimeout()中的上下文。简单地说,此
在setTimeout()内时引用全局对象,因为您已经转移了作用域。处理此问题的典型方法是将this
的上下文存储在变量中(通常是that
):
这是因为此
会丢失setTimeout()中的上下文。简单地说,此
在setTimeout()内时引用全局对象,因为您已经转移了作用域。处理此问题的典型方法是将this
的上下文存储在变量中(通常是that
):
传递给每个的函数接收第二个参数,即dom元素本身。您只需使用此选项即可:
$("li").each(function(i, el) {
setTimeout(function() {
alertThis($(el).text() + i);
}, 1000 * i);
alertThis($(el).text() + i + ' outside of timeout');
});
传递给的函数将接收第二个参数,即dom元素本身。您只需使用此选项即可:
$("li").each(function(i, el) {
setTimeout(function() {
alertThis($(el).text() + i);
}, 1000 * i);
alertThis($(el).text() + i + ' outside of timeout');
});
谢谢。不太清楚为什么在setTimeout中不能访问$(this)
,而是将其声明为var。这是因为this
代表的是变化。这不是java或C++,在这里,代码>这个< /C>是一个很可靠的东西,它在JavaScript的地方到处都是,甚至在代码>前缀之类的地方。这里有一条经验法则:如果您在函数()中编写代码,那么假定此
不会更改是不安全的。这意味着setTimeout
函数中的所有内容都在不同的范围内,因此在定义之前,您需要捕获所需的任何内容。谢谢。不太清楚为什么在setTimeout中不能访问$(this)
,而是将其声明为var。这是因为this
代表的是变化。这不是java或C++,在这里,代码>这个< /C>是一个很可靠的东西,它在JavaScript的地方到处都是,甚至在代码>前缀之类的地方。这里有一条经验法则:如果您在函数()中编写代码,那么假定此
不会更改是不安全的。这意味着setTimeout
函数中的所有内容都在不同的范围内,因此在定义该函数之前,您需要捕获所需的任何内容。