javascript - IIFE 用于避免名称冲突?
问题描述
(function(){
var a = b = 3;
})();
(function(){
var a = b = 5;
})();
console.log(b)
console.log(a)
IIFE 有助于避免名称与其他模块发生冲突?我试过上面的代码来理解这个概念。基本上我可以假设上述两个 IIFE 代表两个不同的“模块”并且b
不应该覆盖该变量吗?但是,我们可以将b
被覆盖的值改为 5。
另一个问题是,为什么a
在上述情况下未定义变量?我认为基本上代码将被翻译成下面
var a = b = 3;
let b = 3;
let a = b;
解决方案
var a = b = 3;
正是出于这个原因,它是一种反模式。当你这样做时b
,永远不会用var
. 它相当于:
b = 3 // no var makes b global
var a = b; // var a is scoped to enclosing function
这放入b
了可能不是您想要的全局名称空间。
function test(){
var a = b = 3; // b 'looks' like it will be function scoped...but
}
test()
console.log(b) // b is global even though defined in the function
推荐阅读
- firebase - 更改 Firebase 实时数据库中的值时如何查看 Flutter 应用程序的更改?
- c++ - 使用 getline() 将文件解析为新文件,同时忽略重复条目
- javascript - React 中带有钩子的功能组件中的事件处理程序
- python - Python 找不到模块,pip list 可以
- javascript - 如何对控制器的快速路由器调用进行单元测试
- python - TensorFlow Keras 模型的量化感知训练
- r - Why do function argument names need to match list names with pmap?
- javascript - 当我使用 creatorId:getters.user.id 它告诉我 id undefined
- sql-server - SQL Server MERGE 语法未知问题
- git - 提交到 Github 时如何忽略文件的某些部分?