Javascript 在call and apply中理解这一点
根据call和apply的定义,它们在给定的上下文中执行函数。 但是,下面的代码为Javascript 在call and apply中理解这一点,javascript,Javascript,根据call和apply的定义,它们在给定的上下文中执行函数。 但是,下面的代码为this返回对象{} function Animal() { this.name = "Lion"; this.id = 1; this.getInstance = function() { return this; } } var myObj2 = {}; var myObj = new Animal(); myObj.getInstance.call(myObj2
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存储这个时,它返回了动物对象
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
。
对此有什么可能的解释?当您使用call时,您告诉函数传递的参数必须在该具体函数中作为“this”工作,因此,当您使用call并传递myObj2时,getInstance方法中的this=myObj2,这就是为什么会得到空对象。当您使用call时,您告诉函数传递的参数必须在具体函数中作为“this”使用,因此,当您在getInstance方法中使用call和pass myObj2时,this=myObj2,这就是为什么会得到空对象 对此有什么可能的解释
var myObj=new Animal()时设置了self
调用了code>,此时此
引用了一个新的动物
实例
调用myObj.getInstance.call(myObj2)代码>不会神奇地改变self
的值。它仍然具有执行new Animal()
时设置的值
此外,每个函数都有“它们自己的”这个
,一个函数的这个
的值不会影响另一个函数的这个
的值,也不会对过去发生的分配产生任何影响(self=this;
发生在调用getInstance
之前,并且在不同的上下文中)
下面是一个希望更简单但等效的示例,它不使用此
:
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
的foo
(“abc”
)的值
稍后,我们调用getInstance
,并为其自身的foo
参数(“xyz”
)调用一个不同的参数。但是,这不会影响动物的foo
,也不会影响self
,因为我们只读取self
的值,它仍然是“abc”
对此有什么可能的解释
self
是在调用var myObj=new Animal();
时设置的,此时this
引用了一个新的Animal
实例
调用myObj.getInstance.call(myObj2);
不会神奇地改变self
的值。它仍然具有执行new Animal()
时设置的值
此外,每个函数都有“它们自己的”这个
,一个函数的这个
的值不会影响另一个函数的这个
的值,也不会对过去发生的分配产生任何影响(self=this;
发生在调用getInstance
之前,并且在不同的上下文中)
下面是一个希望更简单但等效的示例,它不使用此
:
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
的foo
(“abc”
)的值
稍后,我们调用getInstance
,并为其自身的foo
参数(“xyz”
)调用一个不同的参数。但是,这不会影响动物的foo
,也不会影响self
,因为我们只读取self
的值,它仍然是“abc”
在Animal()
的函数声明中,此
等于Animal()
的当前实例。当您将此
的值指定给变量self
时,您静态锁定该定义,这意味着它不会更改。它将始终返回Animal()
使用call()
时,您指示Animal()
函数将myObj2
引用为此
-如同Animal()
是myObj2的一个方法。因此此
等于您传递的上下文,在本例中为空对象文本。在Animal()的函数声明中,此
等于Animal()的当前实例
。当您将this
的值指定给变量self
时,您将静态锁定该定义,这意味着它不会更改。它将始终返回Animal()
使用call()
时,您指示Animal()
函数将myObj2
引用为此
-如同Animal()
是myObj2
的一个方法。因此这个
等于您传递的上下文,在本例中,它是一个空的对象文本。call
和apply
都有两个参数,第一个是在回调中作为this
所需的任何参数,第二个参数是传递的参数,调用采用comma分离列表,apply接受一个数组。@adeneo是的,所以在本例中,我将其作为myObj2传递。但是,它为此返回不同的值。变量self
应该用var
声明……不确定您的意思,您没有返回this
,而是self
,这是完全不同的?@adeneo它们有什么不同?call
和apply
都有两个参数,第一个参数是回调中作为this
传递的任何参数,第二个参数是传递的参数,call采用逗号分隔的列表,apply采用数组。@adeneo是的,所以在本例中,我将其作为myObj2传递。但是,它返回的是diff不同值