Javascript回调丢失了“this”
Javascript callbacks losing 'this'
我有一个发行者,我丢失了这个对象中的this
。以下一段 JavaScript 的输出给了我"some-id"
,然后undefined
。当我在回调函数中使用this
时,范围超出了对象,它不能再使用this
了。如何让回调使用"this"或至少可以访问对象?
由于我将创建多个对象,因此我将无法创建像存储这样的"静态"。
这是我的测试代码,您可以使用它来重现我的问题。我想要的是CheckBox.doSomething()
返回this.id
的值,该值应与此测试用例的some-id
匹配。
function CheckBox(input_id) {
this.id = input_id;
this.doSomething();
$('#some-element').click(this.doSomething);
}
Checkbox.prototype.doSomething = function() {
alert(this.input_id);
}
var some_box = new CheckBox('some-id');
some_box.doSomething();
$('#some-element').click();
我什至无法让它按照我想要的方式工作:
function CheckBox2(input_id) {
this.id = input_id;
alert(this.id);
}
CheckBox2.prototype.doSomething = function() {
alert(this.input_id);
}
var some_box = new CheckBox2('some-id');
some_box.doSomething();
你的问题出在这条线上: $('#some-element').click(this.doSomething);
为什么这是一个问题
JavaScript 方法不知道应该分配给this
的对象,它是在显式调用(使用 myFunction.call(obj)
)或隐式调用(使用 obj.myFunction()
调用时)时设置的。
例如:
var x = {
logThis: function () {
console.log(this);
}
};
x.logThis(); // logs x
x.logThis.call(y); // logs y
var func = x.logThis;
func(); // logs window: the fallback for when no value is given for `this`
在您的情况下,您将this.doSomething
传递给 jQuery,然后 jQuery 使用单击的元素作为 this
的值显式调用它。正在发生的事情是(稍微复杂的版本)这个:
var callback = this.doSomething;
callback.call(anElement, anEvent);
解决方案
您需要确保使用正确的值 this
调用doSomething
。您可以通过将其包装在另一个函数中来做到这一点:
var cb = this;
$('#some-element').click(function() {
return cb.doSomething();
});
jQuery提供了一个proxy
函数,让你可以更简单地做到这一点:
$('#some-element').click(jQuery.proxy(this.doSomething, this));
function CheckBox(input_id) {
this.id = input_id;
this.doSomething = $.proxy( this.doSomething, this );
$('#some-element').click(this.doSomething);
}
它的"javascript等效物"是Function#bind
但并非在每个浏览器中都可用,并且由于您似乎正在使用jQuery,因此我正在使用jQuery等效$.proxy
其他人已经解释了问题的原因以及如何使用 jQuery 修复它。剩下的就是如何使用标准JavaScript修复它。而不是。。。
$('#some-element').click(this.doSomething);
。你写:
document.getElementById('some-element').addEventListener('click', this.doSomething.bind(this));
这改变了doSomething
内部this
的上下文。您也可以使用匿名函数来做到这一点 - 而不是...
$('#some-element').click(function(event) {
console.log(this);
});
。你写:
document.getElementById('#some-element').addEventListener('click', (function(event) {
console.log(this);
}).bind(this));
这在有很多回调的项目中对我来说非常有用,例如在 Node.js(您不必关心过时的浏览器)。
编辑:getElementById()
和addEventListener()
而不是$(...).click(...)
。
- Yii ajaxbutton : 如何在成功回调函数中获取 $(this)
- 在jQuery中,我如何从$.ajax回调函数访问$(this)
- 将“this”传递给类 ECMASCRIPT 6 中的回调
- 回调在 Angular2/Firebase 中生成“TypeError: this is undefined”
- ReactJs:this.setState的情况下不调用回调函数
- 绑定promise回调函数的“this”范围
- 在回调中使用主干this.set时出现问题
- 将“this”范围传递给回调函数
- 将 this 应用于 jQuery 回调
- 在 JavaScript 中的异步回调函数中访问“this”
- “this._find(回调)”在猫鼬find()方法中是什么意思
- Javascript OOP 回调 “this” 适用
- 在 JavaScript / jQuery 回调中使用“this”更改单击元素的文本
- 在 HTTP 错误回调中访问“this”
- 在 AngularJS 和 Typescript 的回调中使用$http this
- 主干:在回调中维护对模型的“this”引用的最简单方法
- 概念 - 在 addEventListener 回调中,“this”指的是什么
- Jquery $.ajax 获取响应与将“this”对象嵌套传递到“success”回调函数冲突
- Javascript回调丢失了“this”
- 我可以将 $(this) 传递给 .getJSON 回调函数吗?任何解决方法