Основная идея замыканий заключается в том, что, поскольку доводчики связывают все локальные данные по значению, вы можете использовать их для инициализации, а затем изменения переменных, которые являются только локальными для этого «экземпляра» сгенерированной функции.
Поскольку это похоже на домашнюю работу, я собираюсь ответить на другой вопрос, используя замыкания: используйте замыкания, чтобы получить идеальные квадраты (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
ТеперьСтоит отметить, что локальные переменные, определенные во внешней функции (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
Надеюсь, это поможет объяснить это немного?Если нет, оставьте комментарий.: -)