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在IE中“意外地调用了方法或属性访问”
Nov 19 Javascript
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
DIV外区域Click后关闭DIV的实现代码
Dec 21 Javascript
Javascript中克隆一个数组的实现代码
Dec 06 Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
Aug 21 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
May 24 Javascript
jquery获取table指定行和列的数据方法(当前选中行、列)
Nov 07 Javascript
javascript中json基础知识详解
Jan 19 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
解决vue-router路由拦截造成死循环问题
Aug 05 Javascript
vue实现轮播图帧率播放
Jan 26 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
PHP URL路由类实例
2013/11/12 PHP
php中如何执行linux命令详解
2018/11/06 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
jQuery下通过replace字符串替换实现大小图片切换
2012/05/22 Javascript
用js写了一个类似php的print_r输出换行功能
2013/02/18 Javascript
jQuery中fadeIn、fadeOut、fadeTo的使用方法(图片显示与隐藏)
2013/05/08 Javascript
jquery使用$(element).is()来判断获取的tagName
2014/08/24 Javascript
jQuery中slideUp 和 slideDown 的点击事件
2015/02/26 Javascript
实现前后端数据交互方法汇总
2015/04/07 Javascript
javascript实现自动输出文本(打字特效)
2015/08/27 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖放商品放置购物车
2015/11/30 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
ExtJs异步无法向外传值和赋值的完美解决办法
2017/06/14 Javascript
Chart.js 轻量级HTML5图表绘制工具库(知识整理)
2018/05/22 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
小程序实现授权登陆的解决方案
2018/12/02 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
Python中对列表排序实例
2015/01/04 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
深入浅析HTML5中的SVG
2015/11/27 HTML / CSS
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
俄罗斯童装网上商店:BebaKids
2020/06/06 全球购物
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
2014/09/09 面试题
数据库设计的包括哪两种,请分别进行说明
2016/07/15 面试题
日语专业毕业生自荐信
2013/11/11 职场文书
学校食堂采购员岗位职责
2013/12/05 职场文书
后勤人员岗位职责
2013/12/17 职场文书
文秘档案管理岗位职责
2014/03/06 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
交通事故死亡赔偿协议书
2014/12/03 职场文书
golang 如何用反射reflect操作结构体
2021/04/28 Golang
对Keras自带Loss Function的深入研究
2021/05/25 Python
Pyhton爬虫知识之正则表达式详解
2022/04/01 Python