考虑这个代码,它将a
设置为一个函数。然后f
指向a
,但随后a
被设置为null
。JavaScript函数参考
var a = function() {
return 5;
};
var f = a;
a = null;
但是,调用f()
,5
打印出来的时候。
console.log(f());
为什么不打电话f()
导致空对象引用?
考虑这个代码,它将a
设置为一个函数。然后f
指向a
,但随后a
被设置为null
。JavaScript函数参考
var a = function() {
return 5;
};
var f = a;
a = null;
但是,调用f()
,5
打印出来的时候。
console.log(f());
为什么不打电话f()
导致空对象引用?
这里是一步一步发生了什么:
var a = function() {
return 5;
};
分配函数参考变量a
。
var f = a;
分配相同的功能参考变量f
。此时,a
和f
都包含对相同功能的引用。
a = null;
清除a
所以它不再包含函数引用。但是,f
仍然包含函数引用,并且与a
无关,因此您可以将a
的值更改为您的心脏的内容,并且它不会影响f
具有的值。在上面的第二步之后,每个变量都有自己对该函数的唯一引用。 a
和f
没有指向对方。
这就像是你有两个朋友,你告诉他们每个人一个秘密密码。现在,你告诉第一个朋友,密码现在是不同的。第二位朋友仍然有原始密码 - 他们不会受到你告诉第一位朋友有所不同的事实的影响。
我会说,函数是在JavaScript对象前言我的答案,让我们真正在谈论一般的对象引用。
你实际上不可能null
内存中的对象。您只是将对实际对象的引用设置为null
。 f
是对该对象的引用,就像a
是。您正在使a
不再是对该对象的引用,但完全不影响f
。
垃圾收集器将负责完全删除对象。
在情况不清楚,我会换句话说解释:
var a = {};
使对象在内存中。 a
实际上并不是那个对象,而是对它的引用。
var f = a
表示f
现在引用与a
引用的相同对象。
a = null;
意味着a
不再引用对象,但不影响对象本身。 f
仍然引用该对象。
(在JavaScript中)变量就像一个盒子,可以包含一些东西(var a = ...;
)。两个盒子可以包含相同的东西(var f = a;
)。如果您将其他内容放在其中一个框中(a = null
),则不会更改另一个框(f
)的内容,即使它最初包含相同的内容。