javascript - 如何立即调用 IIFE 以防止它污染全局范围?
问题描述
在关于立即调用函数表达式(关于提供的代码片段)的 Udacity 课程中,它说:
返回的函数关闭(即捕获)hi 变量。这允许 myFunction 维护一个私有的、可变的状态,在函数之外无法访问!更重要的是: 因为表达的函数被立即调用,IIFE 很好地包装了代码,这样我们就不会污染全局范围。
我正在努力理解立即调用匿名函数与防止变量hi
“污染全局范围”有什么关系,并且由于hi
已经在函数中定义,它不是已经在本地/私有范围内了吗?
const myFunction = (
function () {
const hi = 'Hi!';
return function () {
console.log(hi);
}
}
)();
解决方案
在现代 JavaScript 中,你有let
和块作用域(我很确定const
也有块作用域),所以你可以这样做:
let myFunction;
{
let hi = 'Hi!';
myFunction = function () {
console.log(hi);
};
}
这myFunction
不会泄漏hi
到周围的范围内。
在传统的 JavaScript 中,你只有一个var
函数作用域,你可以这样做:
var myFunction;
function a_private_scope() {
var hi = 'Hi!';
myFunction = function () {
console.log(hi);
};
}
a_private_scope();
a_private_scope
限制了 的范围hi
,但是(它是一个函数声明)它需要显式调用,并且我们仍然将名称泄漏到周围的范围(这次是a_private_scope
,作为函数服务的范围的名称)。
通过使用函数表达式并立即调用它,我们避免了第二种名称污染:
var myFunction;
(function () {
var hi = 'Hi!';
myFunction = function () {
console.log(hi);
};
})();
现在,在外部范围中定义的唯一内容是myFunction
. 用作作用域的匿名函数hi
没有可能污染周围作用域的名称。
最后我们可以通过使用返回值来清理一下,所以我们不必提及myFunction
两次:
var myFunction = function () {
var hi = 'Hi!';
return function () {
console.log(hi);
};
}();
(这也为我们节省了一对,(
)
因为function
关键字不再出现在语句的开头。)
推荐阅读
- python - 如何从 Generic 静态获取 TypeVar 参数以用于静态类型检查?
- python - 如何在 syslog 脚本中有序而不是随机地提取消息?
- python - 使用 Python 脚本将视频上传到 Django 模型文件字段
- swift - 从情节提要转至 .xib
- php - MySQL 在顶部选择特色项目
- dns - 如何获取 Pi-hole 以减少 DNS 查询时间
- reactjs - 无法在尚未安装错误的组件上设置状态
- node.js - 在 MERN 堆栈 Web 应用程序中存储图像的最佳方式
- java - 运行 JUnit 测试时,ByteBuddy AgentBuilder 不工作
- visual-studio - 在 excel vb 2019 中着色,使单元格样式正常并合并特定范围