JavaScript中的变量定义与储存介绍


Posted in Javascript onDecember 31, 2014

与C、Java等编程语言不同,JavaScript中的变量是无类型的,所有的变量定义使用的关键词均为var:

var a;

var m, n;

var x=42, y="test";

如果定义变量后未对该变量进行赋值,那么该变量的值为undefined。如上面代码中的a、m、n三个变量的值均为undefined。

由于JS中变量是无类型的,因此完全可以对同一个变量进行不同类型的赋值,如:

var b = "temp";

console.log(typeof b);//string

b = 108;

console.log(typeof b);//number

除了可以对同一变量进行不同类型的赋值,JavaScript中还可以对变量进行重复定义;如果这么做,则第一次之后的变量定义语句等价于赋值语句:

var c = "hello";

console.log(c);//hello

var c = true;

console.log(c);//true

在ECMAScript标准的严格模式(strict mode)下,所有的变量定义均需使用var关键词。如果不使用严格模式,那么当JS程序对某个未被定义过的变量进行赋值时,程序将在JS全局对象中创建一个名称与该变量相同的属性,也即创建一个新的全局变量。这种做法会带来很多问题(比如,多个JS程序间产生全局变量污染等),给后期维护带来不小的麻烦;因此在实际开发过程中,应当尽量避免使用这种做法。

变量的储存

如果定义的变量为全局变量,同时在变量定义过程中没有使用var关键词,那么该变量会作为全局对象的属性而存在,可以通过访问this(全局对象)的相应属性而获得,也可以通过使用delete关键词将其从全局对象中删除掉:

var e = "globalVariableValue";//defined outside of any function, it is a global variable, but does not store in "this"

f = "globalVariableValue2";

this.g = "globalVariableValue3";

console.log(this.e);//undefined

console.log(this.f);//globalVariableValue2

console.log(this.g);//globalVariableValue3
delete f;

delete g;

console.log(this.f);//undefined

console.log(this.g);//undefined

对于JavaScript中的每一次函数调用,JavaScript都会创建一个局部对象以储存在该函数中定义的局部变量;如果在该函数内部还有一个嵌套定义的函数(nested function),那么JavaScript会在已经定义的局部对象内部再定义一个嵌套局部对象。对于一个函数,其内部有多少层的嵌套函数定义,也就有多少层的嵌套局部对象。该局部对象称为“函数调用对象”(ECMAScript 3中的“call object”,ECMAScript 5中改名为“declarative environment record”,但个人认为还是ECMAScript 3中的名称更容易理解一些)。

与全局对象this相反,JavaScript中不提供任何方式来访问这些局部对象(函数调用对象)。因此,开发人员无法对这些局部对象进行操作。不过,理解这些函数调用对象对于理解JavaScript中的一些概念会有很大的帮助,比如说变量的作用域和闭包。

Javascript 相关文章推荐
JavaScript高级程序设计 阅读笔记(十四) js继承机制的实现
Aug 14 Javascript
jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
May 28 Javascript
jQuery:delegate中select()不起作用的解决方法(实例讲解)
Jan 26 Javascript
js实现Select下拉框具有输入功能的方法
Feb 06 Javascript
jQuery子属性过滤选择器用法分析
Feb 10 Javascript
DIV+CSS+jQ实现省市联动可扩展
Jun 22 Javascript
JavaScript从0开始构思表情插件
Jul 26 Javascript
Jquery和Js获得元素标签名称的方法总结
Oct 08 Javascript
实现一个简单的vue无限加载指令方法
Jan 10 Javascript
Angular表格神器ui-grid应用详解
Sep 29 Javascript
jQuery实现中奖播报功能(让文本滚动起来) 简单设置数值即可
Mar 20 jQuery
Vue切换div显示隐藏,多选,单选代码解析
Jul 14 Javascript
JavaScript中的操作符==与===介绍
Dec 31 #Javascript
jQuery中[attribute]选择器用法实例
Dec 31 #Javascript
JavaScript中的比较操作符>、=、
Dec 31 #Javascript
javascript 操作符(~、&、|、^、)使用案例
Dec 31 #Javascript
JavaScript中的逻辑判断符&&、||与!介绍
Dec 31 #Javascript
JavaScript中的eval()函数使用介绍
Dec 31 #Javascript
JSONP跨域GET请求解决Ajax跨域访问问题
Dec 31 #Javascript
You might like
PHP常量使用的几个需要注意的地方(谨慎使用PHP中的常量)
2014/09/12 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP实现对xml的增删改查操作案例分析
2017/05/19 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
PHP数组访问常用方法解析
2020/09/05 PHP
javascript预览上传图片发现的问题的解决方法
2010/11/25 Javascript
JavaScript类型系统之正则表达式
2016/01/05 Javascript
使用webpack-dev-server处理跨域请求的方法
2018/04/18 Javascript
微信小程序实现漂亮的弹窗效果
2020/05/26 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
Vue.js特性Scoped Slots的浅析
2019/02/20 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
Vue.js如何使用Socket.IO的示例代码
2019/09/05 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
2019/10/16 Javascript
Vue利用localStorage本地缓存使页面刷新验证码不清零功能的实现
2020/09/04 Javascript
Vue使用screenfull实现全屏效果
2020/09/17 Javascript
解读Django框架中的低层次缓存API
2015/07/24 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python 排序算法总结及实例详解
2016/09/28 Python
python中快速进行多个字符替换的方法小结
2016/12/15 Python
python命名空间(namespace)简单介绍
2019/08/10 Python
基于FME使用Python过程图解
2020/05/13 Python
使用SQLAlchemy操作数据库表过程解析
2020/06/10 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
Belvilla德国:在线预订度假屋
2018/04/10 全球购物
西铁城美国官方网站:Citizen Watch美国
2019/11/08 全球购物
String s = new String(“xyz”);创建了几个String Object?
2015/08/05 面试题
九年级化学教学反思
2014/01/28 职场文书
社区志愿者活动总结
2014/06/26 职场文书
优秀毕业生的求职信
2014/07/21 职场文书
班子查摆四风个人对照检查材料思想汇报
2014/10/04 职场文书
2014年学生工作总结
2014/11/20 职场文书
2019年个人工作总结范文
2019/03/25 职场文书
导游词之崇武古城
2019/10/07 职场文书