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 面向对象,实现namespace,class,继承,重载
Oct 29 Javascript
javascript 设置某DIV区域内的checkbox复选框
Nov 30 Javascript
Javascript中call的两种用法实例
Dec 13 Javascript
Javascript中的delete操作符详细介绍
Jun 06 Javascript
Javascript中的call()方法介绍
Mar 15 Javascript
解析Node.js基于模块和包的代码部署方式
Feb 16 Javascript
JavaScript 数据类型详解
Mar 13 Javascript
详解axios中封装使用、拦截特定请求、判断所有请求加载完毕)
Apr 09 Javascript
vue实现微信分享链接添加动态参数的方法
Apr 29 Javascript
JS实现移动端双指缩放和旋转方法
Dec 13 Javascript
如何基于js判断浏览器版本
Feb 20 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
Nov 13 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP 时间转换Unix时间戳代码
2010/01/22 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
PHP中文乱码解决方案
2015/03/05 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
通过PHP简单实例介绍文件上传
2015/12/16 PHP
csdn 博客中实现运行代码功能实现
2009/08/29 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
javascript实现复选框超过限制即弹出警告框的方法
2015/02/25 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
2015/03/18 Javascript
JavaScript中setFullYear()方法的使用详解
2015/06/11 Javascript
java必学必会之static关键字
2015/12/03 Javascript
浅谈JS运算符&&和|| 及其优先级
2016/08/10 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
JS实现页面中所有img对象添加onclick事件及新窗口查看图片的方法
2016/12/27 Javascript
详解使用Visual Studio Code对Node.js进行断点调试
2017/09/14 Javascript
详解ES6新增字符串扩张方法includes()、startsWith()、endsWith()
2020/05/12 Javascript
微信小程序文章列表功能完整实例
2020/06/03 Javascript
python实现删除文件与目录的方法
2014/11/10 Python
python多线程操作实例
2014/11/21 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
python数据预处理之将类别数据转换为数值的方法
2017/07/05 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
2019/08/31 Python
python3实现往mysql中插入datetime类型的数据
2020/03/02 Python
Python3创建Django项目的几种方法(3种)
2020/06/03 Python
浅析pandas随机排列与随机抽样
2021/01/22 Python
欧缇丽美国官网:Caudalie美国
2016/12/31 全球购物
英国豪华真皮和布艺沙发销售网站:Darlings of Chelsea
2018/01/05 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
体育教师求职信
2014/06/30 职场文书
2015年五一劳动节活动总结
2015/02/09 职场文书
出纳岗位职责范本
2015/03/31 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
浅谈Python数学建模之线性规划
2021/06/23 Python