JavaScript 闭包嵌套函数

JavaScript Closures Nested Function

每次我调用这个函数a(),我都想得到输出作为第一个参数的平方。我应该如何将 i 的值设为常量,因为每次在函数调用时它都会被重新分配为零。

要求输出为 9,9,9 即。第一个参数是 3

function a(k) {
  i = 0

  function b() {
    if (i == 0) {
      k = k * k
      console.log(k)
      console.log(i)
      i++
    }
  }
  b()
}

a(3)
a(4)
a(5)

你走在正确的轨道上,如果是第一次,你需要保持跟踪,但如果是下一次,你什么也没做。您可以像现在一样继续使用全局变量,如果有值,则 return 它。这里的问题是使用全局不是最好的做法。

var prevValue = null;
function a(k) {
  if (prevValue === null) {
    prevValue = k * k
    return prevValue;
  } else {
    return prevValue;
  }
}

console.log(a(3));
console.log(a(4));
console.log(a(5));

另一种方法是重写函数,使其在您第一次调用后成为不同的函数。这里的问题是函数必须是可访问的,所以你可以覆盖它。

function a(k) {
    var prevValue = k * k;
    a = function () {
      return prevValue;
    }
    return prevValue;
}

console.log(a(3));
console.log(a(4));
console.log(a(5));

最好以没有全局变量的方式定义函数。它将封装变量以便它可以被函数读取而不是放在全局范围内。

var a = (function (){
  var prevValue = null
  return function(k) {
    if (prevValue === null) {
      prevValue = k * k;
      return prevValue;
    } else {
      return prevValue;
    }
  };
}());


console.log(a(3));
console.log(a(4));
console.log(a(5));

您需要通过使用 let 定义 i 来将其限定在 a 函数内,否则定义 i 是相同的window.i = 0 使其成为 全局 变量,因此,即使在 a 函数执行结束后,它仍保持其值。

function a(k) {
  let i = 0

  function b() {
    if (i == 0) {
      k = k * k
      console.log(k)
      console.log(i)
      i++
    }
  }
  b()
}

a(3)
a(4)
a(5)