在 JavaScript 中的异步回调函数中访问“this”
Accessing "this" in asynchronous callback function in JavaScript
我将如何实现从异步回调函数内部引用父级的"this",如下面的代码片段所示?
var imaginaryAjaxCall = function (fn) {
setInterval(fn, 1000);
}
function parent() {
this.foobar = "foo";
imaginaryAjaxCall(function() {
this.foobar = "bar";
});
}
这是一个用于测试的jsfiddle:http://jsfiddle.net/r0ueon53/11/
编辑:我急忙问道,把它搞砸了。很抱歉使一些评论与此编辑无关。
Javascript 在单个线程上运行。当您将fn
设置为按时间间隔运行时,您访问了一个以异步方式运行的 DOM Api(即使它实际上不是异步的)。发生的情况是,每次传递interval
时,DOM api 都会在回调队列中插入一个回调。因此,每 0 毫秒(嗯,它实际上更接近 4 毫秒,但这是另一个主题)fn
将入回调队列。
现在,回调队列中的回调仅在调用堆栈为空时运行,因此,回调直到之后才会运行
document.getElementById('out').innerHTML = this.foobar;
是 ran,这就是为什么它输出 "foo" 而不是 "bar"。
http://jsfiddle.net/r0ueon53/13/
如果将该行延迟一秒钟,您将看到它输出"bar"。
setTimeout(function () {
document.getElementById('out').innerHTML = that.foobar;
}, 1000);
http://jsfiddle.net/r0ueon53/12/
这是有效的setTimeout
因为它会在 1 秒后将其回调插入回调队列中,因此在将值更改为"bar"的 setInterval 回调之后。
显然,在处理 ajax 时,由于网络速度的差异,使用 setTimeout 来解决这个问题并不一致。相反,您应该将 .innerHTML 向上移动到传递给 ajax 调用的回调中。
相关文章:
- 为什么我不能在 ajax 成功中访问 $(this)
- 在jQuery中,我如何从$.ajax回调函数访问$(this)
- React Native can'无法在render()方法之外访问this.ops
- 通过函数传递“this”时,我是否可以无法访问“this”的属性
- 在 JavaScript 中的异步回调函数中访问“this”
- 在 HTTP 错误回调中访问“this”
- jQuery - 如何在 jquery 中访问 “this.options” dataSousrce 属性
- 在jQuery的.on()数据对象中访问$(this)
- 全局范围 - 在触发事件侦听器后访问“this”
- 从原型中的事件访问“this”
- Javascript原型和访问“this”的父对象
- Backbone/Javascript scope.如何在 .each 中访问 this.el
- 从其他函数访问“this”类型的JavaScript变量
- 反应:如何访问this.props.children中的参考文献
- 当我使用一个方法作为回调时,它似乎无法访问“this”.为什么?
- 为什么可以't我在对象文字中访问this.properties
- 为什么可以't我在箭头函数中访问“this”
- 无法在extjs中访问this.myvar
- 为什么不是在 JavaScript 中匿名函数之外访问“this”对象的关键字
- 如何访问“this”;对象