热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

不使用var定义的变量

js变量JavaScript声明变量可以用var声明,也可以不用var声明,两种声明变量的方式有什么区别呢?注:此处暂不

js变量

Javascript声明变量可以用var声明,也可以不用var声明,两种声明变量的方式有什么区别呢?

注:此处暂不讨论 ES6 中的 let 和 const

Javascript变量分为 局部变量 和 全局变量

简单理解:


在函数中用var声明的变量即为 局部变量
在函数外用var声明的变量即为 全局变量

但是,这里说的函数中和函数外也不是绝对的,看以下代码及分析:

// demo1
var a = 123; // 全局变量
var b = 456; // 全局变量
console.log(a); // 123
console.log(b); // 456
console.log(window.a); // 123
console.log(window.b); // 456
console.log(window); // 打印结果如下图

demo1 可以看到,不管是直接访问变量 a b 或是访问window对象的属性 a b 都能输出相同结果

// demo2
var a = 123; // 使用var声明
b = 456; // 不使用var声明
console.log(a); // 123
console.log(b); // 456
console.log(window.a); // 123
console.log(window.b); // 456
console.log(window); // 打印结果如下图

 

demo2 打印结果和上面 demo1 "相同"

另外,使用var声明变量也叫显示声明,不用var声明变量也叫隐式声明

通过上面demo1和demo2我们可以得到以下结论:


在函数外,不管是使用var声明变量,还是不用var声明变量,它们都是全局变量。
全局变量其实是在window对象中添加属性并赋值。

继续看demo...

// demo3
function fn() {var a = 123;var b = 456;console.log(a); // 123console.log(b); // 456console.log(window.a); // undefinedconsole.log(window.b); // undefined
}
fn();

demo3 直接访问变量 a b 可以正常输出结果,访问window对象的属性 a b结果为 undefined

// demo4
function fn() {var a = 123; // 使用var声明b = 456; // 不使用var声明console.log(a); // 123console.log(b); // 456console.log(window.a); // undefinedconsole.log(window.b); // 456
}
fn();
console.log(b); // 456
console.log(window); // 结果如下图

 

demo4 打印结果可以看到:


1.直接访问变量 a b 可以正常输出结果
2.访问window对象的属性 a 结果为 undefined,属性 b 可以正常输出结果
3.在window对象中有属性 b,没有属性 a

是否发现了什么...?

通过上面 demo3 和 demo4 我们可以得到以下结论:


在函数中,使用var声明的变量为局部变量,不用var声明的变量为全局变量

用var声明变量和不用var声明变量的区别之一:


在函数外,用var声明的变量为全局变量,不用var声明的变量为全局变量
在函数中,用var声明的变量为局部变量,不用var声明的变量为全局变量

除了作用域的区别以外

// demo5
var a = 123; // 使用var声明
b = 456; // 不使用var声明
console.log(window.a); // 123
console.log(window.b); // 456
console.log(delete a); // false
console.log(delete b); // true
console.log(window.a); // 123
console.log(window.b); // undefined

注:delete 用来删除对象的属性,如果是不可配置的属性返回false,其他情况返回true
demo5 可以看到,变量 a b 都是全局变量,同为window对象的其中一个属性,a 不可以删除,b 可以删除

用var声明变量和不用var声明变量的区别之二:


同为全局变量,同为window对象的其中一个属性,用var声明的变量不可以删除,不用var声明的变量可以删除!

 

 

对象属性是否可删除, 其实是可以配置的

Object.getOwnPropertyDescriptor(); 方法返回某个对象属性的描述对象
Object.defineProperty(); 方法会直接在某个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象

// demo6
var a = 123; // 使用var声明
b = 456; // 不使用var声明
console.log(Object.getOwnPropertyDescriptor(window, 'a'));
// {value: 123, writable: true, enumerable: true, configurable: false}
console.log(Object.getOwnPropertyDescriptor(window, 'b'));
// {value: 456, writable: true, enumerable: true, configurable: true}

demo6 我们可以看到window对象的属性 a 和 b 的描述对象包含以下信息:


value 属性的值
writable 属性是否可读写
enumerable 属性是否可枚举
configurable 属性是否可配置(删除)
属性 a 和 b 的描述对象区别在于 是否可配置 这个特性
属性 a 为 configurable: false 不可配置
属性 b 为 configurable: true 可配置

 

// demo7
var a = 123; // 使用var声明
b = 456; // 不使用var声明
Object.defineProperty(window, 'b', {configurable: false});
console.log(delete a); // false
console.log(delete b); // false
console.log(window.a); // 123
console.log(window.b); // 456
console.log(Object.getOwnPropertyDescriptor(window, 'b'));
// {value: 456, writable: true, enumerable: true, configurable: false}

通过 demo6 和 demo7 我们得到上面那个问题的答案:


对象的属性是否可删除,取决于描述对象的配置属性configurable
用var声明的变量默认不可删除,不用var声明的变量默认带可删除。

 


推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
author-avatar
优雅de禽兽
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有