考慮這個代碼,它將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
)的內容,即使它最初包含相同的內容。