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 相关文章推荐
javascrpt绑定事件之匿名函数无法解除绑定问题
Dec 06 Javascript
深入document.write()与HTML4.01的非成对标签的详解
May 08 Javascript
javascript history对象(历史记录)使用方法(实现浏览器前进后退)
Jan 07 Javascript
jQuery学习笔记之总体架构
Jun 03 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
Jan 28 Javascript
JS实现进入页面时渐变背景色的方法
Feb 25 Javascript
vue bootstrap小例子一枚
Jun 09 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 Javascript
JavaScript设计模式之代理模式简单实例教程
Jul 03 Javascript
使用layui 的layedit定义自己的toolbar方法
Sep 18 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
vue 数据操作相关总结
Dec 17 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
最新最全PHP生成制作验证码代码详解(推荐)
2016/06/12 PHP
php 常用的系统函数
2017/02/07 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
根据鼠标的位置动态的控制层的位置
2009/11/24 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
Javascript中的 “&” 和 “|” 详解
2017/02/02 Javascript
js实现简单的二级联动效果
2017/03/09 Javascript
vue.js的安装方法
2017/05/12 Javascript
JS检测是否可以访问公网服务器功能代码
2017/06/19 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
微信开发之企业付款到银行卡接口开发的示例代码
2018/09/18 Javascript
JS数组方法concat()用法实例分析
2020/01/18 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
python+django加载静态网页模板解析
2017/12/12 Python
解决Python安装后pip不能用的问题
2018/06/12 Python
Python调用C++,通过Pybind11制作Python接口
2018/10/16 Python
Python 判断图像是否读取成功的方法
2019/01/26 Python
Python selenium根据class定位页面元素的方法
2019/02/26 Python
Python3中的最大整数和最大浮点数实例
2019/07/09 Python
python实现微信打飞机游戏
2020/03/24 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
高级人员简历的自我评价分享
2013/11/03 职场文书
购房公证委托书(2014版)
2014/09/12 职场文书
幼儿园法制宣传日活动总结
2014/11/01 职场文书
优秀党员个人总结
2015/02/14 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android
分享node.js实现简单登录注册的具体代码
2022/04/26 NodeJs