我试图理解为什么当用var声明权限时,变量‘Permises’的类型是‘Function’,而当用let声明时,变量的类型是‘Object’(这是例外行为)

With‘var’-权限类型为‘Function’

var Permissions;

(function (Permissions) {
    Permissions[Permissions["ADMIN"] = 0] = "ADMIN";
    Permissions[Permissions["READ_ONLY"] = 1] = "READ_ONLY";
})(Permissions || (Permissions = {}));

console.log(typeof Permissions);

WITH‘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’类型?

推荐答案

在全局作用域中声明具有var的变量将使其成为window的属性. 因为您还没有初始化它,所以它实际上指向现有的window.Permissions属性,这是一个navigator.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>

有了这个和其他许多问题继承到var,我认为var是遗留的和危险的,并禁止它与ESLint.

Javascript相关问答推荐

Vue.js使用特定索引值的数据更新html

获取POS餐厅会话用户/收银员

用户单击仅在JavaScript中传递一次以及其他行为

reaction useEffect KeyDown for each 条目配音输出

D3多线图显示1线而不是3线

如何在使用fast-xml-parser构建ML时包括属性值?

使用javascript将Plotly Expandable Sparkline转换为HighCharter Plot在bslib卡中

在观察框架中搜索CSV数据

如何在Javascript中使用Go和检索本地托管Apache Arrow Flight服务器?

未捕获错误:[]:getActivePinia()被调用,但没有活动Pinia.🍍""在调用app.use(pinia)之前,您是否try 使用store ?""

屏幕右侧屏障上的产卵点""

setcallback是什么时候放到macrotask队列上的?

如何解决useState错误—setSelect Image不是函数''

如何在文本字段中输入变量?

用于在路径之间移动图像的查询

Web Crypto API解密失败,RSA-OAEP

Nextjs 13.4 Next-Auth 4.2登录(&Quot;凭据&,{});不工作

将嵌套数组的元素乘以其深度,输出一个和

react -原生向量-图标笔划宽度

使用线性插值法旋转直线以查看鼠标会导致 skip