Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在call and apply中理解这一点_Javascript - Fatal编程技术网

Javascript 在call and 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

根据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); //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
,此时
引用了一个新的
动物
实例

调用
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不同值