在调用和应用中理解这一点
Understanding this in call and apply
根据调用和应用的定义,它们在给定的上下文上执行函数。但是,以下代码为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'
两个函数Animal
和getInstance
都有一个参数foo
。当调用Animal
时,self
被设置为Animal
的foo
("abc"
)的值。
稍后,我们使用不同的getInstance
来调用它自己的foo
参数("xyz"
)。然而,这并不影响Animal
的foo
,也不影响self
,因为我们只是读取self
的值,它仍然是"abc"
。
当您使用call时,您会告诉函数,传递的参数必须在该具体函数中作为"this"工作,因此,当您在getInstance方法中使用call并传递myObj2,this=myObj2时,您得到空对象的原因是什么。
在Animal()
的函数声明中,this
等于Animal()
的当前实例。当您将this
的值分配给变量self
时,您静态地锁定了该定义,这意味着它不会更改。它将始终返回Animal()
。
当您使用call()
时,您指示Animal()
函数将myObj2
称为this
,就好像Animal()
是myObj2
的方法一样。因此this
等于您传递的上下文,在本例中,它是一个空的对象文字。
- 如何做到这一点,使代码在不传递条件后执行函数
- gmap3如何做到这一点-它显示圆圈的任何事件
- 硒元素在这一点上是不可点击的
- JQuery是否有一个“;移动“;作用或者有没有一种更紧凑的方法来做到这一点
- 为什么这个代码不起作用?我花了很长时间试图弄清楚这一点
- AngularJS:有没有比指定的方法更好的方法来实现这一点
- Mootorial在这一点上有多重要或过时
- Javascript递归函数引用了这一点
- 我想听听服务器上的更改,并相应地更新我的网页.我如何用Javascript做到这一点
- JavaScriptEs6在内部函数中引用了这一点
- js并在加载前编辑url-如何做到这一点
- 角度缩小2-有人成功做到这一点吗
- Javascript OOP-在异步回调中丢失了这一点
- 谷歌地图与方向 - 我可以在没有表单标签的情况下做到这一点吗?
- config.fullPage = true;在 ckEditor 内联模式下无法正常工作.如何实现这一点
- window.btoa( // here programcode // ) 如何做到这一点
- 在调用和应用中理解这一点
- I'我正在创建一个需要读写HTML文件的Mac应用程序.我该如何做到这一点
- 我正在制作一个phonegap应用程序,iframes在safari中自动打开-我怎么能阻止这一点
- Webview网络应用程序广告,如何做到这一点,并使其跨平台