深入理解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中定义对象类别
Dec 22 Javascript
jQuery 1.4 15个你应该知道的新特性(译)
Jan 24 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
Mar 20 Javascript
jquery 表格排序、实时搜索表格内容(附图)
May 19 Javascript
利用jQuery实现可以编辑的表格
May 26 Javascript
jQuery实现Meizu魅族官方网站的导航菜单效果
Sep 14 Javascript
深入浅析JavaScript中prototype和proto的关系
Nov 15 Javascript
每天一篇javascript学习小结(RegExp对象)
Nov 17 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
Apr 20 Javascript
基于JavaScript实现类名的添加与移除
Apr 23 Javascript
实现单层json按照key字母顺序排序的示例
Dec 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
PHP提取中文首字母
2008/04/09 PHP
php数组函数序列之array_search()- 按元素值返回键名
2011/11/04 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
php数组删除元素示例
2014/03/21 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHPTree――php快速生成无限级分类
2018/03/30 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
JS正则表达式修饰符global(/g)用法分析
2016/12/27 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
小程序实现列表删除功能
2018/10/30 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
vue微信分享到朋友圈 vue微信发送给好友
2018/11/28 Javascript
详解微信小程序scroll-view横向滚动的实践踩坑及隐藏其滚动条的实现
2019/03/14 Javascript
[01:01:29]2018DOTA2亚洲邀请赛 4.4 淘汰赛 VP vs Liquid 第一场
2018/04/05 DOTA
巧用Python装饰器 免去调用父类构造函数的麻烦
2012/05/18 Python
Python-OpenCV基本操作方法详解
2018/04/02 Python
python利用requests库模拟post请求时json的使用教程
2018/12/07 Python
python画图——实现在图上标注上具体数值的方法
2019/07/08 Python
Django 设置多环境配置文件载入问题
2020/02/25 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
毕业设计计划书
2014/01/09 职场文书
爱情保证书范文
2014/02/01 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
《夕阳真美》教学反思
2014/04/27 职场文书
教师文明餐桌光盘行动倡议书
2015/04/28 职场文书
社区文明倡议书
2015/04/28 职场文书
硕士论文致谢范文
2015/05/14 职场文书
导游词之岳阳楼
2019/09/25 职场文书
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL
MySQL如何解决幻读问题
2021/08/07 MySQL
vue elementUI表格控制对应列
2022/04/13 Vue.js