读书频道 > web开发 > Javascript > Effective JavaScript:编写高质量JavaScript代码的68个有效方法
第12条:理解变量声明提升
2013-12-07 14:52:29     我来说两句 
收藏    我要投稿   
本书共分为7章,分别涵盖JavaScript的不同主题。第1章主要讲述最基本的主题,如版本、类型转换要点、运算符注意事项和分号局限等。第2章主要讲解变量作用域,介绍此方面的一些基本概念,以及一些最佳实践经验。第  立即去当当网订购

JavaScript支持词法作用域(lexical scoping),即除了极少的例外,对变量foo的引用会被绑定到声明foo变量最近的作用域中。但是,JavaScript不支持块级作用域,即变量定义的作用域并不是离其最近的封闭语句或代码块,而是包含它们的函数。

不明白JavaScript的这一特性将会导致一些微妙的Bug,例如:

 

该程序在for循环体内声明了一个局部变量player。但是由于JavaScript中变量是函数级作用域(function-scoped),而不是块级作用域,所以在内部声明的player变量只是简单地重声明了一个已经存在于作用域内的变量(即参数player)。该循环的每次迭代都会重写同一变量。因此,return语句将player看作others的最后一个元素,而不是此函数最初的player参数。

理解JavaScript变量声明行为的一个好办法是把变量声明看作由两部分组成,即声明和赋值。JavaScript隐式地提升(hoists)声明部分到封闭函数的顶部,而将赋值留在原地。换句话说,变量的作用域是整个函数,但仅在var语句出现的位置进行赋值。图2.2提供了变量声明提升的可视化图。

 

变量声明提升也可能导致变量重声明的混淆。在同一函数中多次声明相同变量是合法的。这在写多个循环时会经常出现。



 

 提示

在代码块中的变量声明会被隐式地提升到封闭函数的顶部。

重声明变量被视为单个变量。

考虑手动提升局部变量的声明,从而避免混淆。

点击复制链接 与好友分享!回本站首页
分享到: 更多
您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:第11条:熟练掌握闭包
下一篇:第13条:使用立即调用的函数表达式创建局部作用域
相关文章
图文推荐
3.12 本章小结
3.10 添加新函数
3.9 递归
3.8 闭包
排行
热门
文章
下载
读书

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做最好的IT技术学习网站