为啥这个变量没有在 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的,因为setTimeoutwindow的一个方法。

$('#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 函数中设置?的主要内容,如果未能解决你的问题,请参考以下文章

为啥带有 setTimeout 的函数不会导致堆栈溢出

js 里的 settimeout函数

为啥我的状态没有在这个组件中设置

在js对象的方法里有setTimeout函数,在setTimeout里怎么调用该对象方法,用this没有用

为啥框架集中两个子页面不能同时运行settimeout或者setInterval函数

为啥我不能在 React 中设置这个状态?