首页 > 语言 > JavaScript > 正文

javascript 显示全局变量与隐式全局变量的区别

2024-05-06 15:01:26
字体:
来源:转载
供稿:网友

在JavaScript中,全局变量有两种声明方式

使用 var 显示声明的全局变量

不使用 var 声明的隐式全局变量

两者的区别在于是否能通过 delete 操作符删除

先看一段代码

var a = 'a'; // 显式声明的全局变量b = 'b'; // 隐式声明的全局变量 console.log(a); // aconsole.log(b); // bconsole.log(window.a); // aconsole.log(window.b); // b

在 js 中全局变量其实是global对象(window)的属性,因此两种方式声明的全局变量都可以通过 window 拿到

尝试用 delete 删除

// 显式声明的全局变量不能被删除delete a; // 返回 false  // 隐式声明的全局变量可以被删除delete b; // 返回 true  // 删除情况console.log(typeof a); // stringconsole.log(typeof b); // undefined

delete 操作符可以删除一个对象的属性,但如果属性是一个不可配置(non-configurable)属性,删除时则会返回 false(严格模式下会抛出异常)

这就表示使用 var 声明的变量是不可配置的,使用 getOwnPropertyDescriptor 来获取描述属性特性的对象来验证这一点

Object.getOwnPropertyDescriptor(window, a); // {value: "a", writable: true, enumerable: true, configurable: false}Object.getOwnPropertyDescriptor(window, b); // {value: "b", writable: true, enumerable: true, configurable: true}

两者的根本区别在于显式声明的变量不可配置,不能通过 delete 操作符删除

需要注意的是 configurable 值一旦为 false,描述属性特性的对象就不能被修改,因此不能通过修改属性描述符使得显示声明的全局变量能被 delete 删除,但反过来,可以使隐式声明的全局变量也不能被 delete 删除

b = 'b';var descriptor = Object.getOwnPropertyDescriptor(window, b);descriptor.configurable = false;Object.defineProperty(window, b, descriptor);delete b; // 返回 false 

以下是其他网友的补充

JavaScript之全局变量和隐式全局变量

隐式全局变量和明确定义的全局变量间有些小的差异,就是通过delete操作符让变量未定义的能力。

1、通过var创建的全局变量(任何函数之外的程序中创建)是不能被删除的。
2、无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的。

这表明,在技术上,隐式全局变量并不是真正的全局变量,但它们是全局对象的属性。属性是可以通过delete操作符删除的,而变量是不能的:

// 定义三个全局变量var global_var = 1;global_novar = 2; // 反面教材(function () {  global_fromfunc = 3; // 反面教材}()); // 试图删除delete global_var; // falsedelete global_novar; // truedelete global_fromfunc; // true // 测试该删除typeof global_var; // "number"typeof global_novar; // "undefined"typeof global_fromfunc; // "undefined"            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选