当前位置:首页 > 日记 > 正文

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

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

在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"

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

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

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

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

相关文章

fckeditor部署到weblogic出现xml无

fckeditor部署到weblogic出现xml无

显示,解决方法,读取,样式,电脑软件,本文实例讲述了fckeditor部署到weblogic出现xml无法读取及样式不能显示问题的解决方法。分享给大家供大家参考,具体如下:当部署含有Fckeditor编辑器的应用程序时,在tomcat下什么问题都没有,但当部署到weblogi…

让bootstrap的carousel支持滑动滚

让bootstrap的carousel支持滑动滚

支持,滚屏,代码,电脑软件,bootstrap,原始的轮播组件,并不支持滑动滚屏:代码如下:<span style="white-space:pre"> </span><div class="row"> <div id="carousel-generic" class="carousel slide" data-ride="carousel"> …

excel表格中怎么输入学号数据excel

excel表格中怎么输入学号数据excel

数据,方法,输入,学号,表格,  Excel中经常需要使用到输入学号的技巧,学号具体该如何输入呢?具体设置方法,下面是由小编分享的excel表格输入学号数据的教程,欢迎大家来到学习。excel表格输入学号数据的方法excel表格输入学号的步骤1:打开软件进…

excel2007转换pdf的方法

excel2007转换pdf的方法

方法,转换,电脑软件,pdf,  在Excel中录入好时候乬以后经常需要把Excel转化成PDF文件,如果不懂得如何把Excel转换PDF的朋友不妨学习一下。下面是小编带来的关于excel2007转换pdf的方法,希望阅读过后对你有所启发!excel2007转换pdf的方法:  …

CDR2017压感笔和压感设备该怎么设

CDR2017压感笔和压感设备该怎么设

设置,该怎么,设备,电脑软件,压感笔,CDR2017中想要使用压感笔来绘制一些形状,该怎么设置呢?下面我们就来看看详细的教程。软件名称:CorelDRAW Graphics Suite 2017 简体中文破解版 64位软件大小:695MB更新时间:2017-07-03一、调整笔设置1、单击菜…

jquery 仿锚点跳转到页面指定位置

jquery 仿锚点跳转到页面指定位置

锚点,指定位置,跳转到,实例,页面,js 仿锚点跳转到页面指定位置,用的是 offset() 方法$(document).ready(function(){ var target_top = $("#qa5").offset().top; //$("html,body").animate({scrollTop: target_top}, 1000); //带滑动效…

JavaScript中双符号的运算详解

JavaScript中双符号的运算详解

运算,详解,符号,电脑软件,JavaScript,一、双波浪号var i = 5.1;var j = 5.5;console.log(~~i); // 5console.log(~~j); // 5作用类似Math.floor。类似的意思是在处理正数的时候,如果处理负数就它俩就不同了:~~-5.1 // 5Math.floor(-5.1) // -…

PHP实现广度优先搜索算法 | BFS,Br

PHP实现广度优先搜索算法 | BFS,Br

广度优先搜索,算法,详解,电脑软件,PHP,本文实例讲述了PHP实现广度优先搜索算法。分享给大家供大家参考,具体如下:广度优先搜索的算法思想 Breadth-FirstTraversal广度优先遍历是连通图的一种遍历策略。因为它的思想是从一个顶点V0开始,辐射状…

ps怎么制作逐帧动画?

ps怎么制作逐帧动画?

逐帧动画,电脑软件,ps,PS是我们常用的软件,大多数人都多少会一些,经常用它来修图,但是却很少有人知道它也可以用来制作动画,有很多简单的动画图都可以用PS来完成,下面小编就来讲下用PS怎么做动画。软件名称:Adobe Photoshop 8.0 中文完整绿色破解…

了解什么是Excel2007的工作簿和工

了解什么是Excel2007的工作簿和工

工作,电脑软件,  在操作Excel 2007之前,我们需要了解单元格、工作表、工作簿三者之间的关系。以下是小编为您带来的关于了解Excel2007的工作簿和工作表,希望对您有所帮助。了解Excel2007的工作簿和工作表Excel工作簿在Excel中,工作簿是处理…

.net core如何使用Redis发布订阅

.net core如何使用Redis发布订阅

发布订阅,如何使用,电脑软件,net,core,Redis是一个性能非常强劲的内存数据库,它一般是作为缓存来使用,但是他不仅仅可以用来作为缓存,比如著名的分布式框架dubbo就可以用Redis来做服务注册中心。接下来介绍一下.net core 使用Redis的发布/订阅…

PS简单绘制一个轻写实的油漆刷icon

PS简单绘制一个轻写实的油漆刷icon

图标,教程,绘制,简单,油漆刷,效果图:主要过程:12 阅读全文教程结束,以上就是PS简单绘制一个轻写实的油漆刷icon图标教程的全部内容,希望大家喜欢!相关教程推荐:photoshop中短信icon图标按钮制作教程Photoshop设计简洁风格的线性ICON图标Photosho…