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 相关文章推荐
表单(FORM)的一些实用效果代码
Mar 25 Javascript
De facto standard 世界上不可思议的事实标准
Aug 29 Javascript
js对象关系图 方便dom操作
Mar 18 Javascript
jQuery实现列表自动循环滚动鼠标悬停时停止滚动
Sep 06 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
Feb 26 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
解决Vue页面固定滚动位置的处理办法
Jul 13 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
Jul 28 Javascript
小程序server请求微信服务器超时的解决方法
May 21 Javascript
vue里的data要用return返回的原因浅析
May 28 Javascript
微信小程序云函数使用mysql数据库过程详解
Aug 07 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
Yii中表单用法实例详解
2016/01/05 PHP
PHP仿微信多图片预览上传实例代码
2016/09/13 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
Laravel中encrypt和decrypt的实现方法
2017/09/24 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
基于Vue2实现的仿手机QQ单页面应用功能(接入聊天机器人 )
2017/03/30 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
2017/04/17 Javascript
JS+jQuery实现注册信息的验证功能
2017/09/26 jQuery
Node.js readline 逐行读取、写入文件内容的示例
2018/03/01 Javascript
angular实现input输入监听的示例
2018/08/31 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
vue中$nextTick的用法讲解
2019/01/17 Javascript
原生js代码能实现call和bind吗
2019/07/31 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
[44:04]OG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
跟老齐学Python之从格式化表达式到方法
2014/09/28 Python
python内存管理分析
2015/04/08 Python
centos6.7安装python2.7.11的具体方法
2017/01/16 Python
python3操作mysql数据库的方法
2017/06/23 Python
通过Py2exe将自己的python程序打包成.exe/.app的方法
2018/05/26 Python
python语言元素知识点详解
2019/05/15 Python
如何基于Python实现自动扫雷
2020/01/06 Python
详解python with 上下文管理器
2020/09/02 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
如何使用PHP session
2015/04/21 面试题
Linux的主要特性
2016/09/03 面试题
狼和鹿教学反思
2014/02/05 职场文书
晚会主持词开场白
2014/03/17 职场文书
家长会演讲稿
2014/04/26 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
安全生产工作汇报材料
2014/10/28 职场文书