Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 正在分析$(this)以在setTimeout内运行_Javascript_Jquery - Fatal编程技术网

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
函数中的所有内容都在不同的范围内,因此在定义该函数之前,您需要捕获所需的任何内容。