2017-09-21 70 views
0

在該代碼段,trueFactorial(5)返回120:函數聲明VS函數表達引起不同的結果

function factorial(num) { 
 
    if (num <= 1) { 
 
    return 1; 
 
    } else { 
 
    return num * arguments.callee(num - 1); 
 
    } 
 
} 
 

 
var trueFactorial = factorial; 
 

 
var factorial = function(num) { 
 
    return 0; 
 
} 
 

 
console.log(trueFactorial(5));

但在這個代碼段,trueFactorial(5)返回0

function factorial(num) { 
 
    if (num <= 1) { 
 
    return 1; 
 
    } else { 
 
    return num * arguments.callee(num - 1); 
 
    } 
 
} 
 

 
var trueFactorial = factorial; 
 

 
function factorial(num) { 
 
    return 0; 
 
} 
 

 
console.log(trueFactorial(5));

唯一的區別是,我們通過在第一個片段變量賦值聲明factorial。這種差異的原因是什麼?

+0

瞭解吊裝 – epascarello

+0

@LarsPeterson - 所不同的是第11行,並在問題的標題解釋。 – Quentin

+0

@Quentin我現在看到它 –

回答

2

函數聲明被掛起。變量賦值不是。

在示例一中,您將第一個函數分配給trueFactorial

在例子二中,第二個函數被掛起,所以它被賦值爲trueFactorial

+0

謝謝,我有一種感覺就是這樣。那麼說在函數提升中,最後一個函數體總是被分配給變量函數名的函數體呢? – Sahand

+0

對於給定的範圍,是的。 – Quentin

0

JavaScript解釋器首先使用function <...> (<arguments>)語法查看代碼中所有函數的聲明。在你的第二個片段中,你用這個語法同時聲明瞭函數,所以解釋器首先看到第一個聲明,記住它的內容,然後看到另一個聲明。此時,它將取代新的第一個聲明。

當您使用var關鍵字時,解釋程序在開始之前,但代碼正在運行時,不會看到該聲明。

+0

這與'var'關鍵字無關。兩種情況下的聲明都是一樣的。這是作業有不同的時間。 – Quentin

+0

是的,因爲'var'是在運行過程中改變函數內容的賦值,而''函數<...>()'語法在程序啓動之前更改函數的內容*。 – ClementNerma

+0

你混淆了'var'(它聲明變量)和'='(它賦值給變量)的意義。 (函數聲明將聲明一個變量併爲其賦值)。 – Quentin

-1

在第二個示例中,您的函數被掛起並被賦值爲trueFactorial函數。這意味着它最終是對同一功能的引用。在第一個例子中,引用指向內存中的另一個地址。

參見:

function factorial(num){ 
 
    if (num <=1){ 
 
     return 1; 
 
    } else { 
 
     return num*arguments.callee(num-1); 
 
    } 
 
} 
 

 
var trueFactorial = factorial; 
 

 
var factorial = function(num){ 
 
    return 0; 
 
} 
 

 
console.log(trueFactorial(5));//120 
 

 
console.log(trueFactorial === factorial);//false

function factorial(num){ 
 
    if (num <=1){ 
 
     return 1; 
 
    } else { 
 
     return num*arguments.callee(num-1); 
 
    } 
 
} 
 

 
var trueFactorial = factorial; 
 

 
function factorial(num){ 
 
    return 0; 
 
} 
 

 
console.log(trueFactorial(5));//0 
 

 
console.log(trueFactorial === factorial);//true