关于关闭的问题?这是伪闭包的一种形式吗?如果是,为什么要对此使用函数闭包?

Question regarding closures? Is this a form of pseudo-closure, if so, why use function closures over this?

我目前正在学习 JS,试图了解闭包及其用途。我知道它们对于避免污染全局范围很有用,但后来我意识到,下面的代码是不是基本上与不使用函数的闭包相同?我不确定我是否错过了闭包的要点,所以如果有更多知识的人可以验证这是一个闭包,如果是,为什么使用函数更好。

log = console.log;
dir = console.dir; 
{
  let x = 0;

  function testFunc() {
    log(++x);
  }
}

let func = testFunc;
testFunc();

我想您正在将您的代码与以下内容进行比较:

log = console.log;

let func = function() {
  let x = 0;

  function increment() {
    log(++x);
  }
  return increment;
}();

func();
func();

你的代码确实是等价的。在 EcmaScript 2015(也称为 EcmaScript 6)中将 let 变量声明添加到 JavaScript 之前,使用了旧样式。这增加了创建范围为块而不是整个函数的变量的能力。

如果您更改版本以使用 var x = 0;x 变量会污染全局范围。

闭包通常在其他函数中的另一个原因是您可以创建它们的动态数量。

function create_counter(start = 0) {
  return function() {
    return start++;
  }
}

counter1 = create_counter();
counter2 = create_counter(5);
console.log(counter1());
console.log(counter1());

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