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

我们继续讨论关于上下文敏感的传奇故事:嵌套函数声明。当你知道没有标准的方法在局部块里声明函数时,你可能会感到惊讶。然而现在,这是完全合法的,而且人们习惯于在另一个函数的顶部嵌套函数声明。


 

由于内部的函数f出现在if语句块中,因此你可能认为第一次调用test产生数组?["local", "global"],第二次调用产生数组["global"]。但是要记住JavaScript没有块级作用域,所以内部函数f的作用域应该是整个test函数。第二个例子的合理猜测是["local", "local"]和["local"]。而事实上,一些JavaScript环境的确如此行事。但并不是所有的JavaScript环境都这样。其他一些环境在运行时根据包含函数f的块是否被执行来有条件地绑定函数f。(不仅使代码更难理解,而且还致使性能降低。这与with语句没什么不同。)

关于这一点ECMAScript标准说了什么呢?令人惊讶的是,几乎没有。直到ES5,JavaScript标准才承认局部块函数声明的存在。官方指定函数声明只能出现在其他函数或者程序的最外层。ES5甚至建议将在非标准环境的函数声明转变成警告或错误。一些流行的JavaScript实现在严格模式下将这类函数报告为错误(具有局部块函数声明的处于严格模式下的程序将报告一个语法错误)。这有助于检测出不可移植的代码,并为未来的标准版本在给局部块函数声明指定更明智和可移植的语义开辟了一条路。

在此期间,编写可移植的函数的最好方式是始终避免将函数声明置于局部块或子语句中。如果你想编写嵌套函数声明,应该将它置于其父函数的最外层,正如最开始的示例所示。另外,如果你需要有条件地选择函数,最好的办法是使用var声明和函数表达式来实现。

 

这消除了内部变量(重命名为g)作用域的神秘性。它无条件地作为局部变量被绑定,而仅仅只有赋值语句是有条件的。结果很明确,该函数完全可移植。

 提示

始终将函数声明置于程序或被包含的函数的最外层以避免不可移植的行为。

使用var声明和有条件的赋值语句替代有条件的函数声明。

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

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