全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

在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实现复选框的全选和取消全选  # Java中Integer两种转int方法比较  # java中fastjson生成和解析json数据(序列化和反序列化数据)  # javascript history对象详解  # java使用FastJson解析Json数据  # java根据ip地址获取详细地域信息的方法  # 基于JavaScript实现本地图片预览  # Java的Jackson库中复杂对象集合的几种简单转换  # Java中创建对象的5种方式总结  # java 同步、异步、阻塞和非阻塞分析  # java 获取一组数据中的最大值和最小值  # 隐式  # 可以通过  # 你可以  # 的是  # 是一个  # 如果你  # 模式下  # 为你  # 两种  # 这就  # 就不能  # 希望大家  # 为其  # 什么东西  # 有两种  # 你做  # 你必须  # 可以随时  # 需要注意 


相关文章: 制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何在宝塔面板中修改默认建站目录?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  如何在阿里云ECS服务器部署织梦CMS网站?  如何通过万网虚拟主机快速搭建网站?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  深圳网站制作平台,深圳市做网站好的公司有哪些?  高防服务器如何保障网站安全无虞?  网站制作企业,网站的banner和导航栏是指什么?  ,有什么在线背英语单词效率比较高的网站?  潍坊网站制作公司有哪些,潍坊哪家招聘网站好?  如何高效配置IIS服务器搭建网站?  如何在阿里云域名上完成建站全流程?  建站之星如何实现网站加密操作?  网站制作公司排行榜,四大门户网站排名?  存储型VPS适合搭建中小型网站吗?  威客平台建站流程解析:高效搭建教程与设计优化方案  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  建站之星代理如何获取技术支持?  建站主机选择指南:服务器配置与SEO优化实战技巧  建站之星如何开启自定义404页面避免用户流失?  网站设计制作企业有哪些,抖音官网主页怎么设置?  jQuery 常见小例汇总  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  h5在线制作网站电脑版下载,h5网页制作软件?  网站建设制作、微信公众号,公明人民医院怎么在网上预约?  已有域名能否直接搭建网站?  红河网站制作公司,红河事业单位身份证如何上传?  如何快速建站并高效导出源代码?  如何用PHP快速搭建CMS系统?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  如何自定义建站之星模板颜色并下载新样式?  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  免费视频制作网站,更新又快又好的免费电影网站?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  MySQL查询结果复制到新表的方法(更新、插入)  企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?  长沙企业网站制作哪家好,长沙水业集团官方网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  教学网站制作软件,学习*后期制作的网站有哪些?  ,巨量百应是干嘛的?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  建站之星IIS配置教程:代码生成技巧与站点搭建指南  如何通过主机屋免费建站教程十分钟搭建网站?  b2c电商网站制作流程,b2c水平综合的电商平台?  北京营销型网站制作公司,可以用python做一个营销推广网站吗? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。