javascript - 创建带闭包和不带闭包的私有变量
问题描述
最近,我一直在尝试学习 JavaScript 中的私有变量和闭包。我刚刚了解了 IIFE 以及它们如何与闭包一起使用来创建“私有”变量和函数。下面是我理解的一个例子。
let test = (function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
})();
test.setName("Bob");
test.getName(); // "Bob"
test.name; // undefined
然而,这让我想知道,为什么我不能用一个正则函数表达式来完成这个,然后调用这个表达式,然后把它保存到一个变量中。这个新变量也将有一个私有名称值。例如:
let test2 = function() {
let name = "";
let getName = function() {
return name;
}
let setName = function(newName) {
name = newName;
}
return {
getName: getName,
setName: setName
};
}
let test3 = test2();
test3.setName("Bob");
test3.getName(); // "Bob"
test3.name; // undefined
IIFE 方法与我在定义它后立即调用的正则函数表达式相比有什么好处吗?
谢谢!
解决方案
好处是 IIFE 只是一个表达式。没有对封闭的命名空间进行任何更改(嗯,至少不是由 IIFE 本身直接更改)。当你需要一个作用域来做一些工作时,它很有用,但是你在一个只允许一个表达式的上下文中。IIFE 可以是任何东西,也许是一个完整的程序,但它为封闭的上下文返回一个值(例如,像一个对象初始化器)。
推荐阅读
- typo3 - 如果 TYPO3 中提供核心或扩展更新,则自动生成电子邮件
- c++ - 创建散列链接方法时无法访问头指针
- asp.net - 如何通过单击任何 gridview 单元格将 gridview 标题文本值作为字符串获取
- c# - 基于 C# Windows 的应用程序的 Polly 框架问题
- reactjs - 如何绕过浏览器加载项阻止 Azure Application Insight 日志
- c# - 区分鼠标设备和 LowLevel 鼠标挂钩
- excel - Excel Power Query 和 XML 映射
- javascript - react-jss 动态值在查询中不起作用
- r - 基于包含列表的列的子集数据框,并从这些列表中创建不同的子集数据框
- php - cURL 使用 http(无 https)和特定端口显示远程图像,使用 PHP