深入理解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 相关文章推荐
javascript 进阶篇2 CSS XML学习
Mar 14 Javascript
js用typeof方法判断undefined类型
Jul 15 Javascript
js实现刷新iframe的方法汇总
Apr 27 Javascript
jQuery右下角旋转环状菜单特效代码
Aug 10 Javascript
Bootstrap每天必学之基础排版
Nov 20 Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 Javascript
AngularJs  unit-testing(单元测试)详解
Sep 02 Javascript
JS去除重复并统计数量的实现方法
Dec 15 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
Oct 09 Javascript
Vue清除定时器setInterval优化方案分享
Jul 21 Javascript
基于javascript的无缝滚动动画1
Aug 07 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
实现树状结构的两种方法
2006/10/09 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
ThinkPHP添加更新标签的方法
2014/12/05 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
PHP闭包函数详解
2016/02/13 PHP
微信公众平台开发(五) 天气预报功能开发
2016/12/03 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
JS 图片缩放效果代码
2010/06/09 Javascript
JS模拟按钮点击功能的方法
2015/12/22 Javascript
探讨:JavaScript ECAMScript5 新特性之get/set访问器
2016/05/05 Javascript
jQuery无刷新上传之uploadify3.1简单使用
2016/06/18 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
vue中如何使用ztree
2018/02/06 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
iphone刘海屏页面适配方法
2019/05/07 Javascript
使用js实现一个简单的滚动条过程解析
2019/09/10 Javascript
Vue的data、computed、watch源码浅谈
2020/04/04 Javascript
使用Python压缩和解压缩zip文件的教程
2015/05/06 Python
python比较两个列表大小的方法
2015/07/11 Python
Python松散正则表达式用法分析
2016/04/29 Python
Python只用40行代码编写的计算器实例
2017/05/10 Python
Python中音频处理库pydub的使用教程
2017/06/07 Python
python实现自动登录
2018/09/17 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
介绍一下linux的文件权限
2014/07/20 面试题
优秀团员个人的自我评价
2013/10/02 职场文书
《猫》教学反思
2014/02/26 职场文书
2014年最新离婚协议书范本
2014/10/11 职场文书
湖南省党的群众路线教育实践活动总结会议新闻稿
2014/10/21 职场文书
致运动员赞词
2015/07/22 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书