JS中的“this”关键字 - 我很困惑

时间:2014-08-04 13:10:37

标签: javascript oop javascript-objects

我对JS中的this关键字感到困惑,如下所示。为什么在第3行中未定义this.this_?任何简单的exalain为此?在第2行)this指向Window对象 - 我很惊讶,但它对我来说是可以接受的 - 为什么呢?唯一适合我的是使用this2_变量,但我认为这不是优雅的。如何使用this以优雅,优雅的方式始终工作并指向O对象?

var a = function(callback){
    callback('test');
};
var O = function(){
    this.val = 'abc';
    var this2_ = this;
    this.this_ = this;

    this.f = function(){
        console.log(this);           // (1) this -> O object, that's OK
        a(function(){           
            console.log(this);       // (2) this -> Window object
            console.log(this.this_); // (3) this.this_ -> undefined
            console.log(this2_);     // (4) this2_ -> O object
        });
    }
};
var o = new O();
o.f();

1 个答案:

答案 0 :(得分:3)

不建议"管理" this,因为它会在不同的范围内发生变化。在这种情况下,当您尝试在新函数中获取值时,您处于新范围内,this引用窗口对象。

您应该使用新变量并尝试不将内容附加到this。只是出于只读原因使用它

注意:这不是不可能的(例如jQuery对this进行了非常好的管理),但不建议这样做。

所以在你的情况下,你可以这样做:

var O = function(){
    var this2;
    this2.this_ = this;
    this2.val = 'abc';

    this.f = function(){
        a(function(){       
            console.log(this2.val);   // (1) 'abc' 
            console.log(this2.this_); // (2) O object
        });
    }
};