这是关闭还是不同?
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
的函数,仅此而已。由于 name
、age
和 designation
都没有在 calculateBonus
中使用,JavaScript 引擎将在闭包中优化它们。
以下位与闭包无关:-
它们(name
、age
和 designation
)被复制为您从 EmployeeDetails
函数显式返回的新对象的属性。因此,即使您更改 newEmployee.name = 'Frank'
,您也只是在更改该对象上的 属性 name
而不是 [=19= 中声明的 name
] 功能。一旦该对象返回,内部 name
就会丢失,因为它是一个变量,该变量保留在该函数的本地并且没有被任何其他函数关闭(准确地说,在内部使用)。
有趣的一点:-
根据 JS 所基于的规范,内部函数 (calculateBonus
) 在技术上关闭了其外部作用域的所有变量,无论它们是否在该函数内部使用,但 JS引擎足够聪明,可以检测到并优化它们。
我在早些时候学习闭包时遇到了这个关于模块模式的函数,据我了解,这感觉就像一个闭包,因为 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
的函数,仅此而已。由于 name
、age
和 designation
都没有在 calculateBonus
中使用,JavaScript 引擎将在闭包中优化它们。
以下位与闭包无关:-
它们(name
、age
和 designation
)被复制为您从 EmployeeDetails
函数显式返回的新对象的属性。因此,即使您更改 newEmployee.name = 'Frank'
,您也只是在更改该对象上的 属性 name
而不是 [=19= 中声明的 name
] 功能。一旦该对象返回,内部 name
就会丢失,因为它是一个变量,该变量保留在该函数的本地并且没有被任何其他函数关闭(准确地说,在内部使用)。
有趣的一点:-
根据 JS 所基于的规范,内部函数 (calculateBonus
) 在技术上关闭了其外部作用域的所有变量,无论它们是否在该函数内部使用,但 JS引擎足够聪明,可以检测到并优化它们。