提问人:Edi 提问时间:9/10/2023 最后编辑:jabaaEdi 更新时间:9/10/2023 访问量:30
IIFE 与使用 let 或 var 声明的变量相关联的奇怪行为
IIFE strange behavior linked to variables declared with let or var
问:
我试图理解为什么当使用 var 声明权限时,变量“Permissions”将是 typeof 'function',而当使用 let 声明时,变量 'object' 类型(这是例外行为)
使用 'var' - 权限是 'function' 的类型
var Permissions;
(function (Permissions) {
Permissions[Permissions["ADMIN"] = 0] = "ADMIN";
Permissions[Permissions["READ_ONLY"] = 1] = "READ_ONLY";
})(Permissions || (Permissions = {}));
console.log(typeof Permissions);
使用 'let' - 权限是 'object' 的类型
let Permissions;
(function (Permissions) {
Permissions[Permissions["ADMIN"] = 0] = "ADMIN";
Permissions[Permissions["READ_ONLY"] = 1] = "READ_ONLY";
})(Permissions || (Permissions = {}));
console.log(typeof Permissions);
我把这两种情况都排除在“对象”之外。为什么使用“var”权限是“function”的类型?
答:
1赞
Alexander Nenashev
9/10/2023
#1
在全局范围内声明变量 with 会使其成为 的属性。
由于您尚未初始化它,因此它实际上指向现有属性,该属性是 navigator.permissions
的构造函数。var
window
window.Permissions
let
以不同的方式工作,并在当前作用域中声明一个单独的变量:
console.log(Permissions);
console.log(navigator.permissions.__proto__ === Permissions.prototype);
var test = 'test';
console.log(window.test);
如果你把你放在一个函数作用域中,它的工作方式是这样的:var
let
(function(){
var Permissions;
(function (Permissions) {
Permissions[Permissions["ADMIN"] = 0] = "ADMIN";
Permissions[Permissions["READ_ONLY"] = 1] = "READ_ONLY";
})(Permissions || (Permissions = {}));
console.log(typeof Permissions);
})();
也可在模块作用域中工作:let
<script type="module">
var Permissions;
(function (Permissions) {
Permissions[Permissions["ADMIN"] = 0] = "ADMIN";
Permissions[Permissions["READ_ONLY"] = 1] = "READ_ONLY";
})(Permissions || (Permissions = {}));
console.log(typeof Permissions);
</script>
由于这个问题和其他许多问题被遗留下来,我将其视为遗留和危险,并用 ESLint 禁止它。var
var
评论
var Permissions; console.log(typeof Permissions)