在通话中理解这一点并申请

时间:2014-11-06 17:51:38

标签: javascript

根据call和apply的定义,它们在给定的上下文中执行函数。 但是,以下代码为Object{}

返回了this
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。 对此有什么可能的解释?

3 个答案:

答案 0 :(得分:3)

  

对此有何可能的解释?

调用self时设置了{p> 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设置为Animal的{​​{1}}(foo)的值。

稍后,我们使用其"abc"参数(getInstance)的不同名称foo。但是,这不会影响"xyz"的{​​{1}},也不影响Animal,因为我们只是读取 foo的值,这仍然是self

答案 1 :(得分:1)

当你使用call时,你告诉函数传递的参数必须作为"这个"在那个具体的函数里面,所以,当你使用call并传递myObj2时,这个= myObj2里面的getInstance方法,你得到空对象的原因是什么。

答案 2 :(得分:1)

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

当您使用call()时,您已指示Animal()函数将myObj2称为this - 好像Animal()是{{1}的方法}}。所以myObj2等于你传递的上下文,在这种情况下,是一个空的对象文字。