显示为未定义数字的阶乘

时间:2018-12-13 07:34:40

标签: javascript

我是JavaScript的新手,正在尝试学习闭包。有许多使用if语句查找阶乘的示例。我正在尝试在for循环中执行此操作,但结果显示为未定义。

我的代码:

function factorial(num){

    var num = 5;

    function calculateFactorial(){

       for(i=num-1; i>=1; i--){
           num= num*i; // num *= i
       }
       return num;
    }
}

console.log(factorial());

我在哪里弄错了?

4 个答案:

答案 0 :(得分:1)

如果要使用闭包,则需要从factorial()返回:

function factorial(foo){ 
    let num = foo;       
    function calculateFactorial(){
        for (let i = num - 1; i >= 1; i--) {
            num = num * i;
        }
        return num;
    }
    return calculateFactorial;
 }

 let myFunc = factorial(10);
 console.log(myFunc());// Output: 3628800

让我为我展示一个更简单和说明性的例子:

function fooFunction(foo){ 
    let num = foo;       
    function calculateFactorial(){
        num +=1;
        return num;
    }
    return calculateFactorial;
 }

 let myFunc = fooFunction(1);
 console.log(myFunc()); // Output: 2
 console.log(myFunc()); // Output: 3
 console.log(myFunc()); // Output: 4
 console.log(myFunc()); // Output: 5

请阅读cool answers at SO about what closure is。这些是一些亮点:

  • 每当在另一个函数中使用函数时,都会使用闭包。
  • JavaScript中的闭包就像保留所有局部变量的副本一样,就像它们退出函数时一样。
  • 最好是认为总是创建闭包只是一个函数的入口,并且将局部变量添加到该闭包中。
  • 每次调用带有闭包的函数时,都会保留一组新的局部变量(假设该函数内部包含一个函数声明,并且将返回对该内部函数的引用或为其保留外部引用以某种方式)。

答案 1 :(得分:1)

简单来说,您不需要在calculateFactorial函数中使用另一个函数factorial

function factorial(num){
    for(i=num-1; i>=1; i--){
        num= num*i; // num *= i
    }
    return num;
}
console.log( factorial(5));

答案 2 :(得分:0)

这是解决方案: (您需要在内部调用函数,还需要返回)

function factorial(num_){
   
    var num;
    if (typeof num_ === "undefined") { 
      num = 5;
    } else {
      num = num_;
    }

    var calculateFactorial = function(){

       for(var i=num-1; i>=1; i--){
           num= num*i; // num *= i
       }
       return num;
    }
    return calculateFactorial();
}

console.log(factorial(2));

答案 3 :(得分:0)

正确的方法是:

function factorial(num){

    function calculateFactorial(num){

       for(i=num-1; i>=1; i--){
           num= num*i; // num *= i
       }
       return num;
    }
    return calculateFactorial(num);
}

console.log(factorial(5));

您要做的是首先定义一个函数析因,该函数将num作为变量,然后在其中定义另一个函数以实际计算结果。因此,使方法变得复杂了

  

Blockquote

     

Blockquote