IIFE 与使用 let 或 var 声明的变量相关联的奇怪行为

IIFE strange behavior linked to variables declared with let or var

提问人:Edi 提问时间:9/10/2023 最后编辑:jabaaEdi 更新时间:9/10/2023 访问量:30

问:

我试图理解为什么当使用 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”的类型?

JavaScript 函数 var let iife

评论

1赞 Jaromanda X 9/10/2023
尝试它与 IIFE 无关 - 一切都与权限 API 以及 var 和 let 之间的微妙区别有关var Permissions; console.log(typeof Permissions)
0赞 pilchard 9/10/2023
这回答了你的问题吗?“let”和“var”有什么区别?

答:

1赞 Alexander Nenashev 9/10/2023 #1

在全局范围内声明变量 with 会使其成为 的属性。 由于您尚未初始化它,因此它实际上指向现有属性,该属性是 navigator.permissions 的构造函数。varwindowwindow.Permissions

let以不同的方式工作,并在当前作用域中声明一个单独的变量:

console.log(Permissions);
console.log(navigator.permissions.__proto__ === Permissions.prototype);

var test = 'test';
console.log(window.test);

如果你把你放在一个函数作用域中,它的工作方式是这样的:varlet

(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 禁止它。varvar