2013-08-05 67 views
0
var f1 = function(){} 

var f2 = f1; 

它指向與f1相同的函數,或者它存儲f1的另一個副本?作爲原始類型或引用類型的變量存儲函數?

+1

你爲什麼要問?你的問題背後有什麼實際問題? –

+0

我讀了關於函數表達式vs聲明,然後感到困惑,它作爲對象或常規基元類型工作。所以它作爲指向對象的指針? – enix

+0

是的,你可以將它看作一種指針,就像對象一樣。實際上函數*是*對象。 –

回答

6

f2的值與f1一樣,是對同一功能的引用。

您可以使用一個事實,即函數對象來證明這一點:

var f1 = function(){} 
var f2 = f1; 
f1.a = 3; 
console.log(f2.a); // logs 3 

但你不能改變的功能核心,很少有實際使用中知道了這個,除了這個事實你不」如果您複製函數引用,則會使用大量內存。

+0

如果您將f1指定爲數字,則這是錯誤的。 'var f1 = 10; var f2 = f1; f1.a = 3; console.log(f2.a); // logs undefined' – zsong

+0

@sza你在測試中看到的問題是因爲自動裝箱:如果你記錄f1.a,你會感到驚訝:你也會看到未定義的。 –

+0

@sza f1.a = 3在你叫它之前被銷燬 – enix

1

這是很容易使用===

var f1 = function(){} 
var f2 = f1; 

console.log(f2===f1) 

>>true 

所以f2f1都指向完全相同的功能來證明。

+0

有趣的事實:'Number.NaN === Number.NaN //返回false' – Strille

+3

這證明什麼都沒有。你有===相等的原始類型沒有他們與引用實現:數字被複制,例如。 –

+0

@dystroy,我不是說用===來證明數字是肯定的。當然,比較數字之間的引用是沒有意義的,因爲它們是基本類型。 – zsong

相關問題