在此代码段中,trueFactorial(5)
返回120:
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));
&#13;
但是在此代码段中,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));
&#13;
唯一的区别是我们在第一个片段中通过变量赋值声明了factorial
。这种差异的原因是什么?
答案 0 :(得分:2)
函数声明已悬挂。变量赋值不是。
在示例一中,您将第一个函数分配给trueFactorial
。
在示例二中,第二个函数被提升,因此它被分配给trueFactorial
。
答案 1 :(得分:0)
JavaScript解释器首先使用function <...> (<arguments>)
语法查看代码中所有函数的声明。在您的第二个片段中,您使用此语法将该函数声明为时间,因此解释器首先查看第一个声明,记住其内容,然后查看另一个声明。此时,它将取代新的第一个声明。
当您使用var
关键字时,解释器在开始之前不会看到声明,但代码正在运行。
答案 2 :(得分:-1)
在第二个示例中,您的函数被提升并被赋值为trueFactorial函数。这意味着它最终是对同一函数的引用。在第一个示例中,引用指向内存中的另一个地址。
请参阅:
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
{{1}}