2017-09-21 46 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