避免"that"的解决方案是什么?
What are the solutions for avoiding "that"?
所以采取以下简单的 javascript class 片段:
var Class = function() {
this.publicvar = 1;
this.privileged = function() {
return this.publicvar;
};
};
var c = new Class();
setTimeout(c.privileged, 1); //c.this -> window
显然这行不通,"this" 将成为 window 对象。所以此时我们可以做一个var that=this,然后使用that.publicvar,或者,我们可以这样做
setTimeout(function() { c.privileged() }, 1); //c.this -> Class
多么好的解决方案和简单的修复,现在我不必在我的 class 中到处乱放 "that"。更不用说,在使用 object.prototype.publicMethod.
时,使用 "that" 会变得更加复杂
所以,我的问题是:在其他哪些情况下您不得不担心 "this.publicvar" 中的 "this" 被绑定到 window 上下文,什么是每个解决方案? (我希望我们有针对其中每一个的解决方案,所以我永远不必使用它!:)
使用Function
的bind
:
setTimeout(c.privileged.bind(c), 1);
或者你可以在构造函数中预先bind
,但这在 JS 中可能是相当意外的,而它是 Python 中的默认值:
var Class = function() {
this.publicvar = 1;
this.privileged = (function() {
return this.publicvar;
}).bind(this);
};
var c = new Class();
setTimeout(c.privileged, 1);
所以采取以下简单的 javascript class 片段:
var Class = function() {
this.publicvar = 1;
this.privileged = function() {
return this.publicvar;
};
};
var c = new Class();
setTimeout(c.privileged, 1); //c.this -> window
显然这行不通,"this" 将成为 window 对象。所以此时我们可以做一个var that=this,然后使用that.publicvar,或者,我们可以这样做
setTimeout(function() { c.privileged() }, 1); //c.this -> Class
多么好的解决方案和简单的修复,现在我不必在我的 class 中到处乱放 "that"。更不用说,在使用 object.prototype.publicMethod.
时,使用 "that" 会变得更加复杂所以,我的问题是:在其他哪些情况下您不得不担心 "this.publicvar" 中的 "this" 被绑定到 window 上下文,什么是每个解决方案? (我希望我们有针对其中每一个的解决方案,所以我永远不必使用它!:)
使用Function
的bind
:
setTimeout(c.privileged.bind(c), 1);
或者你可以在构造函数中预先bind
,但这在 JS 中可能是相当意外的,而它是 Python 中的默认值:
var Class = function() {
this.publicvar = 1;
this.privileged = (function() {
return this.publicvar;
}).bind(this);
};
var c = new Class();
setTimeout(c.privileged, 1);