使用闭包的Javascript Fibonacci

use*_*743 2 javascript closures fibonacci

我将使用Javascript编写一些代码.以下是我们要做的事情:

"使用闭包实现javascript Fibonacci数.具体来说,写一个存储两个连续Fibonacci数的函数,最初为0和1.该函数还定义并返回一个嵌套函数getNext().getNext()函数更新两个存储的Fibonacci数接下来的两个Fibonacci数并返回当前的数字.例如,在第一次调用getNext()时,返回值为0,在下一次调用时为1,然后再次为1,然后为2,等等.

我有点理解这一点但不是真的.有人可能会帮忙澄清一下吗?谢谢!

Pla*_*ure 8

闭包背后的基本思想是,由于闭包器按值绑定所有本地数据,您可以使用它们来初始化然后修改仅对生成函数的"实例"本地的变量.

由于这看起来像是作业,我将使用闭包来回答另一个问题:使用闭包来获得完美的正方形(1,4,9等),一次一个.

function makeSquareIteratorFunction() {
  var squareRoot = 1;

  var getNext = function() {
    // Calculate the number you need to return
    var square = squareRoot * squareRoot;

    // Apply side effects. In this case just incrementing the counter, but with
    // Fibonacci you will need to be a little more creative :-)
    // You might also prefer to do this first. Depends on your approach.
    squareRoot = squareRoot + 1;

    // Return the value
    return square;
  };

  // Return the function object, which can then be called later
  return getNext;
}

// Usage
var getNextSquare = makeSquareIteratorFunction();
alert(getNextSquare()); // 1
alert(getNextSquare()); // 4
alert(getNextSquare()); // 9
Run Code Online (Sandbox Code Playgroud)

现在,值得指出的是外部函数(makeSquareIteratorFunction)中定义的局部变量是本地化的并绑定到闭包.因此,如果您makeSquareIteratorFunction()多次呼叫,后者将独立于第一个:

var getNextSquare1 = makeSquareIteratorFunction();
alert(getNextSquare1()); // 1
alert(getNextSquare1()); // 4
var getNextSquare2 = makeSquareIteratorFunction();
alert(getNextSquare2()); // 1 (!) because it's a new closure, initialized the same way
alert(getNextSquare1()); // 9 (!) because it was "on" 4 last time
Run Code Online (Sandbox Code Playgroud)

希望这有助于解释一下吗?如果没有,请发表评论.:-)


Gre*_*reg 5

我只是想发布一些最新的答案 - 使用现代 JavaScript 编写的斐波那契闭包更具可读性

function fibonacci() {
    let x = 0;
    let y = 1;
    let z = 0;
    return function getNext() {
        [z, x, y] = [x, y, x + y];
        return z;
    };
}

let fun = fibonacci();

for (let i = 0; i < 10; i++) {
    console.log(fun());
}
Run Code Online (Sandbox Code Playgroud)