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


Posted in Javascript onFebruary 09, 2017

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

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

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

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

先看一段代码

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

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

尝试用 delete 删除

// 显式声明的全局变量不能被删除
delete a; // 返回 false 
 
// 隐式声明的全局变量可以被删除
delete b; // 返回 true 
 
// 删除情况
console.log(typeof a); // string
console.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; // false
delete global_novar; // true
delete global_fromfunc; // true
 
// 测试该删除
typeof global_var; // "number"
typeof global_novar; // "undefined"
typeof global_fromfunc; // "undefined"

在浏览器中,全局对象可以通过window属性在代码的任何位置访问(除非你做了些比较出格的事情,像是声明了一个名为window的局部变量)。但是在其他环境下,这个方便的属性可能被叫做其他什么东西(甚至在程序中不可用)。如果你需要在没有硬编码的window标识符下访问全局对象,你可以在任何层级的函数作用域中做如下操作:

var global = (function () {
  return this;
}());

这种方法可以随时获得全局对象,因为其在函数中被当做函数调用了(不是通过new构造),this总 是指向全局对象。实际上这个病不适用于ECMAScript 5严格模式,所以,在严格模式下时,你必须采取不同的形式。例如,你正在开发一个JavaScript库,你可以将你的代码包裹在一个即时函数中,然后从 全局作用域中,传递一个引用指向this作为你即时函数的参数。

以上就是javascript 显示全局变量与隐式全局变量的区别,两者的根本区别在于显式声明的变量不可配置,不能通过 delete 操作符删除,希望大家多关注三水点靠木的其他文章。

Javascript 相关文章推荐
Jquery选择器 $实现原理
Dec 02 Javascript
JavaScript中获取未知对象属性的代码
Apr 27 Javascript
jQuery Tab插件 用于在Tab中显示iframe,附源码和详细说明
Jun 27 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
JS中append字符串包含onclick无效传递参数失败的解决方案
Dec 26 Javascript
js 实现省市区三级联动菜单效果
Feb 20 Javascript
AngularJS中的路由使用及实现代码
Oct 09 Javascript
解读vue生成的文件目录结构及说明
Nov 27 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
Apr 04 Javascript
vue实现前台列表数据过滤搜索、分页效果
May 28 Javascript
浅谈vuex为什么不建议在action中修改state
Feb 02 Javascript
JS获取本周周一,周末及获取任意时间的周一周末功能示例
Feb 09 #Javascript
简单谈谈Javascript函数中的arguments
Feb 09 #Javascript
javascript 中设置window.location.href跳转无效问题解决办法
Feb 09 #Javascript
微信小程序之picker日期和时间选择器
Feb 09 #Javascript
BootStrap 弹出层代码
Feb 09 #Javascript
jQuery插件form-validation-engine正则表达式操作示例
Feb 09 #Javascript
javascript history对象详解
Feb 09 #Javascript
You might like
在PHP中使用XML
2006/10/09 PHP
建立动态的WML站点(一)
2006/10/09 PHP
微信扫描二维码登录网站代码示例
2013/12/30 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
非常全面的php日期时间运算汇总
2015/11/04 PHP
PHP parse_ini_file函数的应用与扩展操作示例
2019/01/07 PHP
不用写JS也能使用EXTJS视频演示
2008/12/29 Javascript
Jquery中删除元素的实现代码
2011/12/29 Javascript
一个基于jQuery的树型插件(OrangeTree)使用介绍
2012/05/03 Javascript
使用jQuery实现的网页版的个人简历(可换肤)
2013/04/19 Javascript
javascript调试过程中找不到哪里出错的可能原因
2013/12/16 Javascript
通过遮罩层实现浮层DIV登录的js代码
2014/02/07 Javascript
javascript封装的sqlite操作类实例
2015/07/17 Javascript
使用Browserify配合jQuery进行编程的超级指南
2015/07/28 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
AngularJS过滤器filter用法总结
2016/12/13 Javascript
全面分析JavaScript 继承
2019/05/30 Javascript
JS实现省市县三级下拉联动
2020/04/10 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
JS实现京东商品分类侧边栏
2020/12/11 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
详解python的数字类型变量与其方法
2016/11/20 Python
python 文件查找及内容匹配方法
2018/10/25 Python
用python一行代码得到数组中某个元素的个数方法
2019/01/28 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
ProBikeKit美国官网:自行车套件,跑步和铁人三项套件
2016/10/13 全球购物
毕业生物理教师求职信
2013/10/17 职场文书
大学生简单自荐信
2013/11/10 职场文书
班主任工作年限证明
2014/01/12 职场文书
公司联欢会策划方案
2014/05/19 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
给老师的一封感谢信
2015/01/20 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
MySQL之高可用集群部署及故障切换实现
2021/04/22 MySQL