2014-01-05 228 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)的內容,即使它最初包含相同的內容。