2014-01-05 131 views
0

考虑这个代码,它将a设置为一个函数。然后f指向a,但随后a被设置为nullJavaScript函数参考

var a = function() { 
    return 5; 
}; 

var f = a; 

a = null; 

但是,调用f()5打印出来的时候。

console.log(f()); 

为什么不打电话f()导致空对象引用?

http://jsfiddle.net/deDca/

回答

5

这里是一步一步发生了什么:

var a = function() { 
    return 5; 
}; 

分配函数参考变量a


var f = a; 

分配相同的功能参考变量f。此时,af都包含对相同功能的引用。


a = null; 

清除a所以它不再包含函数引用。但是,f仍然包含函数引用,并且与a无关,因此您可以将a的值更改为您的心脏的内容,并且它不会影响f具有的值。在上面的第二步之后,每个变量都有自己对该函数的唯一引用。 af没有指向对方。

这就像是你有两个朋友,你告诉他们每个人一个秘密密码。现在,你告诉第一个朋友,密码现在是不同的。第二位朋友仍然有原始密码 - 他们不会受到你告诉第一位朋友有所不同的事实的影响。

1

我会说,函数是在JavaScript对象前言我的答案,让我们真正在谈论一般的对象引用。

你实际上不可能null内存中的对象。您只是将对实际对象的引用设置为nullf是对该对象的引用,就像a是。您正在使a不再是对该对象的引用,但完全不影响f

垃圾收集器将负责完全删除对象。

在情况不清楚,我会换句话说解释:

var a = {};使对象在内存中。 a实际上并不是那个对象,而是对它的引用。

var f = a表示f现在引用与a引用的相同对象。

a = null;意味着a不再引用对象,但不影响对象本身。 f仍然引用该对象。

0

(在JavaScript中)变量就像一个盒子,可以包含一些东西(var a = ...;)。两个盒子可以包含相同的东西(var f = a;)。如果您将其他内容放在其中一个框中(a = null),则不会更改另一个框(f)的内容,即使它最初包含相同的内容。