函数声明与函数表达式导致不同的结果

时间:2017-09-21 12:14:45

标签: javascript

在此代码段中,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;
&#13;
&#13;

但是在此代码段中,trueFactorial(5)会返回0

&#13;
&#13;
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;
&#13;
&#13;

唯一的区别是我们在第一个片段中通过变量赋值声明了factorial。这种差异的原因是什么?

3 个答案:

答案 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}}