这是关闭还是不同?

Is this a closure or something different?

我在早些时候学习闭包时遇到了这个关于模块模式的函数,据我了解,这感觉就像一个闭包,因为 Salary 仍然在随对象返回的方法的范围内,但其他变量仍然存在在范围内作为闭包,例如姓名和年龄,还是在对象返回后销毁?我认为因为对象引用了那些变量,所以可能所有变量都作为闭包的一部分保持活动状态但不确定。

function EmployeeDetails() {
  var name: "Mayank";
  var age = 30;
  var designation = "Developer",
  var salary = 10000;

  var calculateBonus = function(amount) {
    salary = salary + amount;
  }

  return {
    name: name,
    age: age,
    designation: designation,
    calculateBonus: calculateBonus
  }
}

var newEmployee = EmployeeDetails()

var userName = newEmployee.calculateBonus(1000);

在闭包位置方面:-

这里 calculateBonus 是最终关闭 salary 的函数,仅此而已。由于 nameagedesignation 都没有在 calculateBonus 中使用,JavaScript 引擎将在闭包中优化它们。

以下位与闭包无关:-

它们(nameagedesignation)被复制为您从 EmployeeDetails 函数显式返回的新对象的属性。因此,即使您更改 newEmployee.name = 'Frank',您也只是在更改该对象上的 属性 name 而不是 [=19= 中声明的 name ] 功能。一旦该对象返回,内部 name 就会丢失,因为它是一个变量,该变量保留在该函数的本地并且没有被任何其他函数关闭(准确地说,在内部使用)。

有趣的一点:-

根据 JS 所基于的规范,内部函数 (calculateBonus) 在技术上关闭了其外部作用域的所有变量,无论它们是否在该函数内部使用,但 JS引擎足够聪明,可以检测到并优化它们。