JavaScript中的'let'和'this'有什么区别?

What is the difference between 'let' and 'this' in JavaScript?

我正在学习 JavaScript,来自 Ruby,也在 C 中做过一些事情。我阅读的一个例子是:

function letCounter() {
  let counter = 0;

  return () => ++counter;
}

并与

进行比较
function thisCounter() {
  this._count = 0;
}

thisCounter.prototype.fire = function() {
  this._count ++;
  return this._count;
}

在第一个示例中,无法在 letCounter 实例上访问计数:

let let_counter_ins = letCounter();
let_counter_ins.counter // <- undefined

而在第二个中,计数,~我认为~,是函数本身所有实例的属性?

let this_counter_ins = new thisCounter();
this_counter_ins.count  // <- 0

似乎 JavaScript 中的函数可以有 'state'(对 console.log(let_counter_ins()) 的调用将不断增加计数器,而不是从 0 开始)。但是这个 'state',设置为 let 与设置为 this 的 'state' 有什么不同?似乎 letCounterthisCounter 的实例都在跟踪某个计数器,但它的访问方式不同?试图了解使用 thislet 设置函数属性之间的区别,以及为什么其中之一在外部可用。

在第一个代码中,局部变量 counter 被初始化,返回的函数 关闭 变量(在“闭包”中)。该值仅存在于函数的局部范围内 - 在词法环境中,一旦函数完成,只能通过 () => ++counter 引用。没有办法直接观察闭包的内容,除非闭包可能(或可能不会)返回或使用故意暴露其内容的方法。

每次调用 letCounter 都会为 counter 创建一个新的绑定,为它创建一个新的词法环境,以及一个新的闭包,因此单独调用 letCounter 将导致跟踪单独的计数。

在第二段代码中,与this一样,counter不是局部变量,而是实例对象的普通属性。对象属性完全是 public(除了非常新的 # 私有成员语法,我不会涉及),所以任何东西,包括 thisCounter.prototype.fire 和外部代码都可以访问 this.counter(其中 this 引用实例)或 this_counter_ins.count(其中 this_counter_ins 引用实例)并获取对象的当前值。

let 用于声明一个仅在其父括号内作用域的变量。 (括号外不可见)

这是完全不同的。 它代表拥有实际方法的对象。