避免"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 上下文,什么是每个解决方案? (我希望我们有针对其中每一个的解决方案,所以我永远不必使用它!:)

使用Functionbind:

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);