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 相关文章推荐
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
Mar 12 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
Apr 11 Javascript
jquery form表单提交插件asp.net后台中文解码
Jun 12 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
jQuery制作简洁的图片轮播效果
Apr 03 Javascript
jQuery实现鼠标选中文字后弹出提示窗口效果【附demo源码】
Sep 05 Javascript
extjs简介_动力节点Java学院整理
Jul 17 Javascript
sublime text配置node.js调试(图文教程)
Nov 23 Javascript
JS实现字符串中去除指定子字符串方法分析
May 17 Javascript
微信小程序移动拖拽视图-movable-view实例详解
Aug 17 Javascript
详解ES6 Promise的生命周期和创建
Aug 18 Javascript
为nuxt项目写一个面包屑cli工具实现自动生成页面与面包屑配置
Sep 29 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
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
PHP防CC攻击实现代码
2011/12/29 PHP
解析PHP函数array_flip()在重复数组元素删除中的作用
2013/06/27 PHP
thinkPHP下的widget扩展用法实例分析
2015/12/26 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP+Apache实现二级域名之间共享cookie的方法
2019/07/24 PHP
不要小看注释掉的JS 引起的安全问题
2008/12/27 Javascript
JavaScript 动态创建VML的方法
2009/10/14 Javascript
jquery focus(fn),blur(fn)方法实例代码
2011/12/16 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
解决jQuery使用JSONP时产生的错误
2015/12/02 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
jquery $.trim()去除字符串空格的实现方法【附图例】
2016/03/30 Javascript
js+html5实现canvas绘制网页时钟的方法
2016/05/21 Javascript
Bootstrap响应式表格详解
2017/05/23 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
Angular2学习笔记之数据绑定的示例代码
2018/01/03 Javascript
jQuery实现的3D版图片轮播示例【滑动轮播】
2019/01/18 jQuery
vue鼠标悬停事件实例详解
2019/04/01 Javascript
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
python提取页面内url列表的方法
2015/05/25 Python
详解Python文本操作相关模块
2017/06/22 Python
python生成随机图形验证码详解
2017/11/08 Python
使用Python实现企业微信的自动打卡功能
2019/04/30 Python
简单了解python中的与或非运算
2019/09/18 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Python Tornado之跨域请求与Options请求方式
2020/03/28 Python
selenium设置浏览器为headless无头模式(Chrome和Firefox)
2021/01/08 Python
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
意大利在线药房:Saninforma
2021/02/11 全球购物
中软Java笔试题
2012/11/11 面试题
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
趣味运动会广播稿
2015/08/19 职场文书
MySQL中的布尔值,怎么存储false或true
2021/06/04 MySQL