在错误的上下文中依赖this
是一个常见的陷阱。以下是一个人为制造的例子:
function SomeClass() {
this.prop = 42;
document.body.addEventListener('click', function() {
alert(this.prop); // will be undefined
});
}
new SomeClass();
一种解决方法是使用
bind
(或 call
或 apply
),例如:function SomeClass() {
this.prop = 42;
document.body.addEventListener('click', (function() {
alert(this.prop); // works
}).bind(this));
}
new SomeClass();
另一个选项是通过闭包使this
可用,通常使用_this
或self
:
function SomeClass() {
var _this = this;
this.prop = 42;
document.body.addEventListener('click', function() {
alert(_this.prop); // works
});
}
new SomeClass();
我更喜欢后一种方法,因为我只需要声明一次,而不是用大量的bind()
函数和嵌套回调(虽然这不是理想的,但在实际开发中很常见)变得更简单。但我隐约感到:要么a) 这种方法存在陷阱,或者b) 我必须首先这样做或使用bind
,这意味着我做错了。你有什么想法吗?
bind
由于“不寻常”的规范要求而较慢,但通常在使用bind
的地方性能不应该成为问题。 - Bergibind
可以增加可读性... 当然,你的var prop
是一个不错的特定情况的改进,但当prop
必须是一个属性时,OP 的两种模式都可以。 - Bergi