【问题标题】:Is this a closure or something different?这是关闭还是不同的东西?
【发布时间】:2021-02-13 20:22:08
【问题描述】:

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

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);

【问题讨论】:

  • 还在什么范围内?如果您将此作为方法调用,它会运行并退出。
  • 因此,据我所知,闭包是内部函数/对象对外部父对象的引用。在这种情况下,返回的对象是否维护对 EmployeeDetails 函数范围内的所有变量的引用?如果这个问题没有意义,换一种说法,你会说在上面的代码中应用了任何闭包,如果是,哪些位?谢谢,只是想更好地理解闭包

标签: javascript function object closures


【解决方案1】:

就关闭的位置而言:-

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

以下位与闭包无关:-

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

有趣的一点:-

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    • 2016-10-09
    • 2011-08-17
    • 2018-01-09
    • 1970-01-01
    相关资源
    最近更新 更多