哪种 Javascript 关闭场景是首选?

Which scenario of Javascript closure is preferred?

在什么情况下counter1更可取?计数器2在什么情况下会更好?

我知道在全局范围内声明一个变量是不可预测的,但是有没有这样的场景比在函数内部声明它更可取?

// counter1 code
function counterMaker() {
  let count = 0;
  return function counter() {
    return count++;
  };
}


// counter2 code
let count = 10;

function counter2() {
  return count++;
}

如果您希望它在其他地方可引用,您可以在外部范围内声明 count 变量,而不必增加计数:

let count = 10;

function counter2() {
  return count++;
}


counter2();
counter2();
console.log(count);

如果 count 变量在闭包中,并且闭包只公开返回的函数,则上述情况是不可能的 - 唯一的选择是调用返回的函数,即使你只想检查它的当前值。

如果您想向 counterMaker 的消费者和count 变量的代码 打算 是私有的(并且在外部完全无法访问)。

当您想创建一个计数器的多个实例时,第一种方法也适用,而第二种方法则不行(除非您每次都重复一个计数器变量和函数你想要一个计数器,这很愚蠢)。

Explanation for counter 1 code.

// counter1 code
function counterMaker() {
  let count = 0;
  return function counter() {
    return count++;
  };
}

这里你返回一个函数给调用者。所以可以在调用者处做这样的事情。

var c = counterMaker()
c() //0
c() //1
c() //1
var b = counterMaker()
b() //0
b() //1
b() //1

因为您在尝试使用函数表达式时尝试封闭该函数和变量环境。所以你的增量函数没有暴露在外面。如果这是有道理的,那么你就会理解为什么关闭和在哪里关闭的整个简洁。

Explaination for code 2

// counter2 code
let count = 10;

function counter2() {
  return count++;
}

您正在尝试将增量函数公开到全局中,现在您将无法像上面的代码 1 那样创建多个实例。因此每次调用函数 counter2 时,它只会增加 whatsover。

我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。访问外部变量会产生副作用,您的函数变得依赖于外部发生的变化,而且它们可能是不可预测的。或者,以后你想把这个功能搬过来,你还是需要监控这个外部变量。我认为所有的外部依赖都应该通过参数传递给函数。