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 相关文章推荐
用prototype实现的简单小巧的多级联动菜单
Mar 24 Javascript
javascript 装载iframe子页面,自适应高度
Mar 20 Javascript
setTimeout和setInterval的区别你真的了解吗?
Mar 31 Javascript
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
Dec 11 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 Javascript
基于构造函数的五种继承方法小结
Jul 27 Javascript
在Vue中使用highCharts绘制3d饼图的方法
Feb 08 Javascript
jQuery实现鼠标响应式淘宝动画效果示例
Feb 13 jQuery
浅谈Redux中间件的实践
Jul 27 Javascript
JS实现悬浮球只在一侧滑动并且是横屏状态下
Aug 19 Javascript
vue route新窗口跳转页面并且携带与接收参数
Apr 10 Vue.js
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 Memcached应用实现代码
2010/02/08 PHP
PHP初学者最感迷茫的问题小结
2010/03/27 PHP
PHP ? EasyUI DataGrid 资料存的方式介绍
2012/11/07 PHP
PHP延迟静态绑定示例分享
2014/06/22 PHP
PHP如何实现阿里云短信sdk灵活应用在项目中的方法
2019/06/14 PHP
检测是否已安装 .NET Framework 3.5的js脚本
2009/02/14 Javascript
20个非常有用的PHP类库 加速php开发
2010/01/15 Javascript
brook javascript框架介绍
2011/10/10 Javascript
无缝滚动js代码通俗易懂(自写)
2013/06/19 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JavaScript中length属性的使用方法
2015/06/05 Javascript
浅谈json取值(对象和数组)
2016/06/24 Javascript
js遍历map javaScript遍历map的简单实现
2016/08/26 Javascript
ES6新特性四:变量的解构赋值实例
2017/04/21 Javascript
JS滚动到指定位置导航栏固定顶部
2017/07/03 Javascript
bootstrap confirmation按钮提示组件使用详解
2017/08/22 Javascript
React Native 搭建开发环境的方法步骤
2017/10/30 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
highcharts.js数据绑定方式代码实例
2019/11/13 Javascript
python实现图像识别功能
2018/01/29 Python
Python利用递归实现文件的复制方法
2018/10/27 Python
Python 微信爬虫完整实例【单线程与多线程】
2019/07/06 Python
使用Pyinstaller转换.py文件为.exe可执行程序过程详解
2019/08/06 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
解决python中显示图片的plt.imshow plt.show()内存泄漏问题
2020/04/24 Python
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
Spartoo瑞典:鞋子、包包和衣服
2018/09/15 全球购物
C/C++ 笔试、面试题目大汇总
2015/11/21 面试题
机电工程学生自荐信范文
2013/12/07 职场文书
教育局长自荐信范文
2013/12/22 职场文书
机械设计制造及其自动化专业求职信
2014/06/17 职场文书
单位作风建设剖析材料
2014/10/11 职场文书
2015年环卫工作总结
2015/04/28 职场文书