在调用和应用中理解这一点

Understanding this in call and apply

本文关键字:这一点 应用 调用      更新时间:2023-09-26

根据调用和应用的定义,它们在给定的上下文上执行函数。但是,以下代码为this 返回了Object{}

function Animal() {
    this.name = "Lion";
    this.id = 1;
    this.getInstance = function() {
        return this;
    }
}
var myObj2 = {};
var myObj = new Animal();
myObj.getInstance.call(myObj2); //Object {}

当我用self存储这个时,它返回了Animal对象。

function Animal() {
    self = this;
    this.name = "Lion";
    this.id = 1;
    this.getInstance = function() {
        return self;
    }
}
var myObj2 = {};
var myObj = new Animal();
myObj.getInstance.call(myObj2); //Animal {name: "Lion", id: 1, getInstance: function}

在这两种情况下,我的理解是它应该返回myObj2。对此有什么可能的解释?

对此有什么可能的解释?

self是在调用var myObj = new Animal();时设置的,此时this引用新的Animal实例。

调用myObj.getInstance.call(myObj2);不会神奇地改变self的值。它仍然具有在执行new Animal()时设置的值。

此外,每个函数都有"自己的"this,一个函数的this的值不会影响另一个函数this的值,也不会对过去发生的赋值产生任何影响(self = this;发生在调用getInstance之前,在不同的上下文中)。


这是一个希望更简单但等效的例子,它不使用this:

function Animal(foo) {
    var self = foo;
    this.getInstance = function(foo) {
        return self;
    }
}
var myObj2 = {};
var myObj = new Animal('abc');
myObj.getInstance('xyz'); // returns 'abc'

两个函数AnimalgetInstance都有一个参数foo。当调用Animal时,self被设置为Animalfoo"abc")的值。

稍后,我们使用不同的getInstance来调用它自己的foo参数("xyz")。然而,这并不影响Animalfoo,也不影响self,因为我们只是读取self的值,它仍然是"abc"

当您使用call时,您会告诉函数,传递的参数必须在该具体函数中作为"this"工作,因此,当您在getInstance方法中使用call并传递myObj2,this=myObj2时,您得到空对象的原因是什么。

Animal()的函数声明中,this等于Animal()的当前实例。当您将this的值分配给变量self时,您静态地锁定了该定义,这意味着它不会更改。它将始终返回Animal()

当您使用call()时,您指示Animal()函数将myObj2称为this,就好像Animal()myObj2的方法一样。因此this等于您传递的上下文,在本例中,它是一个空的对象文字。