调用子函数

Calling sub functions

本文关键字:子函数 调用      更新时间:2023-09-26

这是一个查找第n个fibonacci数的程序。

var fib = (function() {
    var save = [];
    var i = 0;
    return {
        "getNum": function(input) {
            this.input = input;
            if (input === 0) {
                console.log("Invalid input");
            }
            save[i] = i;
            save[i + 1] = i + 1;
            save[i + 2] = i + 1;
            i = 2;
            for (i >= 2; i < input; i = i + 1) {
                save[i + 1] = save[i] + save[i - 1];
            }
            console.log(save[i - 1]);
        }
    }
}());
fib.getNum(4);

我的问题是,当我以以下方式实现这个问题时,它不起作用。我理解这是因为我没有调用子函数,只调用主函数。我们是否可以使用一种更好的模式来保持代码的有序性,并且不必调用那么多函数?

var fib = (function() {
    var save = [];
    var i = 0;
    return {
        "getNum": function(input) {
            this.input = input;
            function valid() {
                if (input === 0) {
                    console.log("Invalid input");
                }
            }
            function config() {
                save[i] = i;
                save[i + 1] = i + 1;
                save[i + 2] = i + 1;
                i = 2;
            }
            function nthNum() {
                for (i >= 2; i < input; i = i + 1) {
                    save[i + 1] = save[i] + save[i - 1];
                }
                console.log(save[i - 1]);
            }
        }
    }
}());
fib.getNum(4);

您可以考虑使用closure来创建私有和公共函数。如果您看到下面的代码,则只显示_getNum函数。

var fib = (function() {
    var save = [];
    save[0] = 0;
    save[1] = 1;
    var i = 0;
    //This will validate the number
    // This function can be avoided and make _getNum do the same
    function _valid(input){
      console.log("Method Executing:_valid");
      input === 0 ? console.log('Invalid Input') : _nthNum(input); 
     }
    // Will calualte the series.
    // This is a private function
    function _nthNum(input) {
     console.log('Method Executing:_nthNum');
        for (i = 2; i<=input; i++) {
             save[i] = save[i-2] + save[i - 1];
         }
          console.log(save.pop());
    }
    // Private Function
    function _getNum(input){
            console.log("Method Executing :_getNum" ,input);
            _valid(input);
        }
    //Expose the private function
  return {
   getNum :_getNum      // Expose _getNum
  }
}());
fib.getNum(0);
fib.getNum(4);
fib.getNum(7);

工作副本

我的建议:

var Fibonacci = (function() {
  var _Fibonacci = {
    // set initial values
    result: [0, 1, 1],
    input: 0,
    // main function
    find: function (number) {
      this.input = number;
      if (this.isValid()) {
        this.calculate();
        return this.result.pop();
      }
      return 'Invalid input';
    },
    // sub functions
    isValid: function () {
      return this.input != 0
    },
    calculate: function () {
      for (var i=2; i<this.input; i++) { // fix your code here
        this.result[i+1] = this.result[i] + this.result[i-1];
      }
    }
  };
  
  // return the main function
  return _Fibonacci.find.bind(_Fibonacci);
}());
console.log(
  Fibonacci(0),
  Fibonacci(4),
  Fibonacci(6)
);