为什么这个变量没有在setTimeout函数中设置?

时间:2011-06-15 06:09:53

标签: javascript jquery javascript-events jquery-selectors settimeout

嘿程序员,

我有一个基本的textarea:

<textarea id='text_comment'></div>

我有这个功能:

$('#text_comment').live('keypress', function() {

    setTimeout(function() {
    string = $(this).val();         

         alert(string);
    }, 500);

});

它应该警告textarea中的值,但它不会发出任何警报。

我希望它能在500ms后得到textarea的值,但是如果它在setTimeout函数中,它似乎没有设置变量。

5 个答案:

答案 0 :(得分:5)

上下文变为window,因为setTimeoutwindow的方法。

$('#text_comment').live('keypress', function() {

    var el = this;

    setTimeout(function() {
         var string = $(el).val();         

         alert(string);
    }, 500);

});

如果您以这种方式保存对el的引用,则可以依赖它而不是this

而且,您可以使用el.value,因为不需要将它包装在jQuery中并在.val()

内部执行完全相同的操作

答案 1 :(得分:1)

this的值在传递给setTimeout的函数内部发生了变化。这样做:

$('#text_comment').live('keypress', function() {

    var self = this

    setTimeout(function() {
    string = $(self).val();         

         alert(string);
    }, 500);

});

答案 2 :(得分:1)

this的值取决于当前函数的调用方式。传递给setTimeout的函数是与事件处理程序不同的函数,因此this的值不同。

首先制作this的副本。

$('#text_comment').live('keypress', function() {
    var that = this;
    setTimeout(function() {
    string = $(that).val();         
         alert(string);
    }, 500);

});

答案 3 :(得分:1)

因为回调不是在keypress事件的范围内运行,而是在全局范围window中运行。

将引用复制到局部变量,使其包含在闭包中:

$('#text_comment').live('keypress', function() {

  var element = this;

  window.setTimeout(function() {
    var string = $(element).val();         
    alert(string);
  }, 500);

});

答案 4 :(得分:0)

当触发'keypress'事件时,函数中this的值将为textarea个对象。但是当setTimeout中的函数运行时(500毫秒后),this的值已更改为其他值(可能是window对象)

将您的代码更改为:

$('#text_comment').live('keypress', function() {

    var textarea = this;
    setTimeout(function() {
    string = $(textarea).val();         

         alert(string);
    }, 500);

});