当前位置: 首页 > 面试题库 >

JavaScript将正确的“ this”上下文传递给setTimeout回调?

颛孙正谊
2023-03-14
问题内容

如何传递上下文setTimeout?我想打电话this.tip.destroy(),如果this.options.destroyOnHide在1000毫秒。我怎样才能做到这一点?

if (this.options.destroyOnHide) {
     setTimeout(function() { this.tip.destroy() }, 1000);
}

当我尝试上述操作时,this指的是窗口。


问题答案:

编辑:
总而言之,早在2010年,当有人问这个问题时,解决此问题的最常用方法是保存对进行setTimeout函数调用的上下文的引用,因为setTimeout执行函数时要this指向全局对象:

var that = this;
if (this.options.destroyOnHide) {
     setTimeout(function(){ that.tip.destroy() }, 1000);
}

在一年前发布的ES5规范中,它引入了该bind方法,但最初的答案中并未建议使用该方法,因为该方法尚未得到广泛支持,您需要使用polyfills来使用它,但现在无处不在:

if (this.options.destroyOnHide) {
     setTimeout(function(){ this.tip.destroy() }.bind(this), 1000);
}

bind函数创建一个具有this预填充值的新函数。

现在在现代JS中,这正是箭头函数在ES6中解决的问题:

if (this.options.destroyOnHide) {
     setTimeout(() => { this.tip.destroy() }, 1000);
}

箭头函数没有自己的this值,访问它时,您正在访问的this是封闭词法作用域的值。

HTML5还在2011年对计时器进行了标准化,现在您可以将参数传递给回调函数:

if (this.options.destroyOnHide) {
     setTimeout(function(that){ that.tip.destroy() }, 1000, this);
}


 类似资料:
  • 问题内容: 我有一些如下的JavaScript代码: 我收到未定义的错误,在使用该功能之前,一切都在工作。 我希望一段时间后调用我的函数。我该怎么办? 问题答案: setTimeout(function() { postinsql(topicId); }, 4000) 您需要将匿名函数作为参数而不是字符串作为参数,后一种方法甚至不符合ECMAScript规范,但浏览器比较宽松。这是正确的解决方案,

  • 问题内容: 这个问题一定很明显,但我不知道。 在模板中,我链接到媒体目录中的js文件。从该文件中,我想访问一个{{my_chart}}之类的上下文变量。 问题答案: 我认为这样不可能。如果要访问视图提供的某些数据,则必须将其传递给js函数。 例 js文件: 视图 希望这可以帮助 :)

  • 问题内容: 上周受本文启发,我正在重构我必须更明确地将上下文(数据库池,会话存储等)传递给处理程序的应用程序。 但是,我遇到的一个问题是,如果没有全局模板映射,我的自定义处理程序类型(要满足)上的方法将无法再访问该映射以呈现模板。 我需要保留全局变量,或者将我的自定义处理程序类型重新定义为结构。 有没有更好的方法来实现这一目标? func.go struct.go 有没有更干净的方法将实例传递给?

  • 问题内容: 我正在尝试学习go,并且一开始我想尝试组装一个超级简单的Web服务器来控制iTunes。过去,我已经多次达到这个目的,并认为我可以在这里简单地取消对osascript的调用。 注释掉的“ say 5”命令 确实 起作用。 我收到的回应如下: 我不确定从这里要去哪里,任何方向都将不胜感激。 问题答案: 我明白了 我认为exec.Command(…)如果参数中有空格,则在参数中添加双引号,

  • 问题内容: 我以为这是我可以轻松搜索的东西,但也许我没有问正确的问题… 如何在给定的javascript函数中设置“ this”所指的内容? 例如,与大多数jQuery函数一样,例如: 如何编写/调用自己的独立函数,并在调用时具有适当的“ this”引用?我使用jQuery,因此,如果有jQuery特定的方式可以做到,那将是理想的选择。 问题答案: Javascript 和方法允许您设置函数的 上