当我们使用时var that = this,是复制还是引用.它看起来像是this一个特殊的对象,所以that应该参考一下.那意味着什么时候this改变,that还应该改变?显然不是这样,因为that保持不变.
有人可以为此澄清一下吗?为什么var that = this是一种"价值复制"?
它将一个称为对象引用的值复制this到变量中that.并不是它是一个特殊的对象,这就是JavaScript中引用所有对象的方式(包括数组和函数):存储在变量(参数,属性等)中的是对内存中其他对象的引用,而不是副本对象.
说你有这个:
var a = {
answer: 42
};
Run Code Online (Sandbox Code Playgroud)
这会创建一个新对象并存储引用a.在记忆中你有类似的东西:
+????????????+
a:Ref3554??????>| (object) |
+????????????+
| answer: 42 |
+????????????+
在那里,我使用Ref3554来表示参考值,但这纯粹是概念性的; 你永远不会看到代码中的实际值.
当你这样做:
var b = a; // Copies the value
Run Code Online (Sandbox Code Playgroud)
它将a(引用)中的值复制到b:
a:Ref3554???+
| +????????????+
+??>| (object) |
| +????????????+
b:Ref3554???+ | answer: 42 |
+????????????+
在你的例子中它是相同this的a,that而不是代替而不是代替b.
那意味着什么时候
this改变,that还应该改变?
this不能在范围内改变.但是a可以,让我们继续a.假设我这样做:
a = {
question: "Life, the Universe, and Everything!"
};
Run Code Online (Sandbox Code Playgroud)
我创建了一个新对象并将其分配给a.怎么了b?
什么都没有:
+???????????????+
a:Ref4269??????+| (object) |
+???????????????+
| question: ... |
+???????????????+
+????????????+
b:Ref3554??????>| (object) |
+????????????+
| answer: 42 |
+????????????+
请注意如何a获得新的参考(Ref4269).这对任何事都没有影响b.a并b以任何方式不链接(也不是this和that在你的例子).它们恰好包含了相同的值一段时间,然后(如上所述),它们不再存在,因为其中一个被改变了.
但让我们回到他们都指向同一件事的时候:
var a = {
answer: 42
};
var b = a;
Run Code Online (Sandbox Code Playgroud)
a:Ref3554???+
| +????????????+
+??>| (object) |
| +????????????+
b:Ref3554???+ | answer: 42 |
+????????????+
假设我改变了对象的状态a并b引用了?
a.answer = 27;
Run Code Online (Sandbox Code Playgroud)
怎么了b?好吧,b没有改变,但是它所指向的对象是指向的对象a,并且该对象的状态刚刚被更改,因此无论您使用哪个变量来访问该对象,您都会看到新的状态:
a:Ref3554???+
| +????????????+
+??>| (object) |
| +????????????+
b:Ref3554???+ | answer: 27 |
+????????????+