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实现动态CSS换肤技术的脚本
Jun 29 Javascript
ASP.NET jQuery 实例8 (动态添加内容到DropDownList)
Feb 03 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
jquery读取xml文件实现省市县三级联动的方法
May 29 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
Dec 08 Javascript
JavaScript中Form表单技术汇总(推荐)
Jun 26 Javascript
JS 拼凑字符串的简单实例
Sep 02 Javascript
JS实现两周内自动登录功能
Mar 23 Javascript
webpack4打包vue前端多页面项目
Sep 17 Javascript
详解Vue 动态组件与全局事件绑定总结
Nov 11 Javascript
微信 jssdk 签名错误invalid signature的解决方法
Jan 14 Javascript
javascript浅层克隆、深度克隆对比及实例解析
Feb 09 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中的闭包和匿名函数
2017/12/25 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
js检测客户端不是firefox则提示下载
2007/04/07 Javascript
javascript 常用关键字列表集合
2007/12/04 Javascript
JavaScript入门教程 Cookies
2009/01/31 Javascript
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
JS中prototype关键字的功能介绍及使用示例
2013/07/21 Javascript
JavaScript的常见兼容问题及相关解决方法(chrome/IE/firefox)
2013/12/31 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
jQuery实现的登录浮动框效果代码
2015/09/26 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
深入理解Angular中的依赖注入
2017/06/26 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
jQuery实现获取当前鼠标位置并输出功能示例
2019/01/05 jQuery
element el-table表格的二次封装实现(附表格高度自适应)
2021/01/19 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
python使用arp欺骗伪造网关的方法
2015/04/24 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
PyTorch中permute的用法详解
2019/12/30 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
python打印文件的前几行或最后几行教程
2020/02/13 Python
详解Pycharm出现out of memory的终极解决方法
2020/03/03 Python
PyQt5中向单元格添加控件的方法示例
2020/03/24 Python
瑞贝卡·明可弗包包官网:Rebecca Minkoff
2016/07/21 全球购物
四方通行旅游网:台湾订房、出国旅游
2017/09/20 全球购物
写自荐信的注意事项
2014/03/09 职场文书
大班下学期幼儿评语
2014/12/30 职场文书
2015年党风廉政建设责任书
2015/01/29 职场文书
五四青年节比赛演讲稿
2015/03/18 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
vue+element ui实现锚点定位
2021/06/29 Vue.js
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers