1

我正在学习 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 中的函数可以具有“状态”(调用console.log(let_counter_ins())将不断增加一个计数器,而不是从 0 开始)。而且这个“状态”,设置为与let“状态”设置有什么不同this?似乎两者的实例都letCounterthisCounter跟踪某个计数器,但它的访问方式不同吗?试图了解使用thisvs设置函数属性之间的区别let以及为什么其中一个可以在外部使用。

4

2 回答 2

1

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

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

在第二个代码中, withthis不是counter局部变量,而是实例对象的普通属性。#对象属性是完全公开的(除了我不会涉及的极其新的私有成员语法),所以任何东西,包括thisCounter.prototype.fire外部代码都可以访问this.counterthis引用实例的地方)或this_counter_ins.countthis_counter_ins引用实例的地方)并获取当前对象上的价值。

于 2020-11-12T03:28:39.680 回答
0

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

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

于 2020-11-12T03:29:37.873 回答