根据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
。
对此有什么可能的解释?
答案 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'
两个函数Animal
和getInstance
都有一个参数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
等于你传递的上下文,在这种情况下,是一个空的对象文字。