深入理解javascript变量声明


Posted in Javascript onNovember 20, 2014

相对于C/C++来说,ECMAScript里的for循环并不能创建一个局部的上下文。

for (var k in {a: 1, b: 2}) {

  alert(k);

}

alert(k); // 尽管循环已经结束但变量k依然在当前作用域
任何时候,变量只能通过使用var关键字才能声明。
 
上面的赋值语句:
 
a = 10;
这仅仅是给全局对象创建了一个新属性(但它不是变量)。“不是变量”并不是说它不能被改变,而是指它不符合ECMAScript规范中的变量概念,所以它“不是变量”(它之所以能成为全局对象的属性,完全是因为javascript中存在一个global对象,这样的操作不是声明一个变量而是给global对象增加一个a属性。
 
下面看一个简单的例题来说明问题

if (!("a" in window)) {

    var a = 1;

}

alert(a);

首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1;
 
你可以用如下方式来检测全局变量是否声明
 
"变量名称" in window

第二,所有的变量声明都在范围作用域的顶部,看一下相似的例子:
 

alert("a" in window);

var a;

此时,尽管声明是在alert之后,alert弹出的依然是true,这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部,最终的代码效果是这样的:

var a;

alert("a" in window);

第三,你需要理解该题目的意思是,变量声明被提前了,但变量赋值没有,因为这行代码包括了变量声明和变量赋值。

你可以将语句拆分为如下代码:

var a;    //声明

a = 1;    //初始化赋值

所以总结起来就是当变量声明和赋值在一起用的时候,JavaScript引擎会自动将它分为两部以便将变量声明提前,不将赋值的步骤提前是因为他有可能影响代码执行出不可预期的结果。

题目中的代码相当于:

var a;

if (!("a" in window)) {

    a = 1;

}

alert(a);

根据上述例题的分析,声明变量时如果是声明的局部变量前面一定要加var,如果声明的是全局变量可以不加var(最好限制全局变量的个数,尽量使用局部变量)

下面讲述一个使用var的几个特性

使用var语句多次声明一个变量不仅是合法的,而且也不会造成任何错误。
如果重复使用的一个声明有一个初始值,那么它担当的不过是一个赋值语句的角色。
如果重复使用的一个声明没有一个初始值,那么它不会对原来存在的变量有任何的影响。
没有var声明的变量,是作为全局变量存在的;有var声明的变量,属于局部变量,尤其是在函数内部。并且,经过测试,带var声明比不带var速度要快。函数内尽量多设局部变量,这样即安全又快速,变量操作也更加合理,不会因为函数内胡乱操作全局变量而导致逻辑错误。

声明对象时最好使用对象自面量的方式,这样的速度相对new的方式要快很多。

变量名是自己取的,为了照顾语义和规范,变量名可能稍长,但是注意了,变量名的长度也会影响代码的执行速度。长的变量名声明的执行速度没有短的快。

Javascript 相关文章推荐
Document 对象的常用方法
Jul 31 Javascript
Node.js中使用mongoskin操作mongoDB实例
Sep 28 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
JS中如何实现复选框全选功能
Dec 19 Javascript
JavaScript用构造函数如何获取变量的类型名
Dec 23 Javascript
Bootstrap table两种分页示例
Dec 23 Javascript
AngularJS ng-repeat指令中使用track by子语句解决重复数据遍历错误问题
Jan 21 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
自定义事件解决重复请求BUG的问题
Jul 11 Javascript
js排序与重组的实例讲解
Aug 28 Javascript
原生JS+HTML5实现跟随鼠标一起流动的粒子动画效果
May 03 Javascript
基于element-ui封装表单金额输入框的方法示例
Jan 06 Javascript
javascript限制用户只能输汉字中文的方法
Nov 20 #Javascript
jQuery 中$(this).index与$.each的使用指南
Nov 20 #Javascript
jQuery提示效果代码分享
Nov 20 #Javascript
IE6浏览器中window.location.href无效的解决方法
Nov 20 #Javascript
js判断滚动条是否已到页面最底部或顶部实例
Nov 20 #Javascript
js中数组排序sort方法的原理分析
Nov 20 #Javascript
javascript继承机制实例详解
Nov 20 #Javascript
You might like
一个odbc连mssql分页的类
2006/10/09 PHP
PHP新手上路(十二)
2006/10/09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
2008/12/06 PHP
php小型企业库存管理系统的设计与实现代码
2011/05/16 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
PHP针对中英文混合字符串长度判断及截取方法示例
2017/03/31 PHP
使用Laravel中的查询构造器实现增删改查功能
2019/09/03 PHP
window.open以post方式将内容提交到新窗口
2012/12/26 Javascript
js根据给定的日期计算当月有多少天实现思路及代码
2013/02/25 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
JavaScript中setMonth()方法的使用详解
2015/06/11 Javascript
Nodejs如何复制文件
2016/03/09 NodeJs
教你用javascript实现随机标签云效果_附代码
2016/03/16 Javascript
微信小程序 Nginx环境配置详细介绍
2017/02/14 Javascript
Vue.js简易安装和快速入门(第二课)
2017/10/17 Javascript
基于vue打包后字体和图片资源失效问题的解决方法
2018/03/06 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
python创建和删除目录的方法
2015/04/29 Python
Python2中的raw_input() 与 input()
2015/06/12 Python
python中利用xml.dom模块解析xml的方法教程
2017/05/24 Python
python实现反转部分单向链表
2018/09/27 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Python实现最常见加密方式详解
2019/07/13 Python
python3中rank函数的用法
2019/11/27 Python
如何将 awk 脚本移植到 Python
2019/12/09 Python
python3获取文件中url内容并下载代码实例
2019/12/27 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
阿尔卡特(中国)的面试题目
2014/08/20 面试题
火锅店创业计划书范文
2014/02/02 职场文书
工厂门卫岗位职责范本
2014/04/04 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
跳高加油稿
2015/07/21 职场文书
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL