另一个"this"查询,JavaScript



下面的代码被用作JavaScript中的继承方法,但我在理解代码时遇到了问题,特别是"this"的上下文,所以我添加了一些问题作为代码注释。提前感谢您的启蒙。

var Class = function(){
    var klass = function(){
        //Is "this" referring to the Class class or Klass class?
        //Why is "this" being applied to "this.init"? Isn't this default behavior? 
        //Are they both the same "this"?
        this.init.apply(this, arguments);
    };
    klass.prototype.init = function(){};
    return klass;
};
var Person = new Class;
Person.prototype.init = function(){
// Called on Person instantiation
};
// Usage:
var person = new Person;

如果我误解了整件事,我深表歉意。

this总是指函数的调用方。如果调用类似person.init()的函数,则this引用Person实例。如果您调用一个函数而没有像alert()那样指定this,那么它将引用window

"this"指的是Class类还是Klass类?

两者都不是。最后,它指向您正在创建的新Person实例。

为什么将"this"应用于"this.init"?这不是默认行为吗?

如果你不以this为前缀,那么它将假设你谈论的是其他一些变量/函数,通常是全局的,除非你有闭包。

它们都是同一个"这个"吗?

如果你指的是Classklass,那么不是。正如第一个问题所说:this由调用者或new决定。

有一件事可能令人困惑,那就是apply的使用。apply所做的一切都允许您在调用函数之前设置函数的调用方,并将任何参数作为数组传递。他们这样做的原因是允许用户传递自己的参数。例如,假设我们有以下两个init函数:

Person.prototype.init = function(name) {
    this.name = name;
};
Person2.prototype.init = function(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
};

klass需要通过某种方式将这些参数传递给init函数。它使用apply来完成此操作。因此,以下在功能上是等效的:

var klass = function(a, b) {
    this.init(a, b);
};
// This one can take ANY number of arguments, not just two
var klass = function() {
    this.init.apply(this, arguments);
};

这是因为arguments本质上是一个传递参数的数组。

关于SO,有很多关于Javascript范围的好问题和答案,但要理解的关键概念是..变量的值,这是由调用者建立的。你的问题的答案——"这个"几乎可以指向任何东西。

最新更新