JS编程建议——3:减少全局变量污染-阿里云开发者社区

开发者社区> zhanginzaghi> 正文

JS编程建议——3:减少全局变量污染

简介: 3:减少全局变量污染
+关注继续查看

建议3:减少全局变量污染
定义全局变量有3种方式:
在任何函数外面直接执行var语句。

  1. var f = 'value';
    直接添加一个属性到全局对象上。全局对象是所有全局变量的容器。在Web浏览器中,全局对象名为window。
  2. window.f = 'value';
    直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量。
  3. f = 'value';
    为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象。JavaScript的策略是让那些被忘记预先声明的变量成为全局变量,这导致在程序中查找Bug变得非常困难。

JavaScript语言最为糟糕的就是它对全局变量的依赖性。全局变量就是在所有作用域中都可见的变量。全局变量在很小的程序中可能会带来方便,但随着程序越来越大,它很快变得难以处理。因为一个全局变量可以被程序的任何部分在任意时间改变,使得程序的行为被极大地复杂化。在程序中使用全局变量降低了程序的可靠性。
全局变量使在同一个程序中运行独立的子程序变得更难。如果某些全局变量的名称与子程序中的变量名称相同,那么它们将会相互冲突并可能导致程序无法运行,而且通常还使程序难以调试。
实际上,这些全局变量削弱了程序的灵活性,应该避免使用全局变量。努力减少使用全局变量的方法:在应用程序中创建唯一一个全局变量,并定义该变量为当前应用的容器。

  1. var My = {};
  2. My.name = {
  3. "first-name" : " first ",
  4. "last-name" : " last "
  5. };
  6. My.work = {
  7. number : 123,
  8. one : {
  9. name : " one ",
  10. time : "2012-9-14 12:55",
  11. city : "beijing"
  12. },
  13. two : {
  14. name : "two",
  15. time : "2012-9-12 12:42",
  16. city : "shanghai"
  17. }
  18. };
    只要把多个全局变量都追加在一个名称空间下,将显著降低与其他应用程序产生冲突的概率,应用程序也会变得更容易阅读,因为My.work指向的是顶层结构。当然也可以使用闭包体将信息隐藏,它是另一种有效减少“全局污染”的方法。

在编程语言中,作用域控制着变量与参数的可见性及生命周期。这为程序开发提供了一个重要的帮助,因为它减少了名称冲突,并且提供了自动内存管理。

  1. var foo = function() {
  2. var a = 1, b = 2;
  3. var bar = function() {
  4. var b = 3, c = 4; // a=1, b =3, c=4
  5. a += b + c; // a=8, b =3, c=4
  6. }; // a=1, b =2, c=undefined
  7. bar(); // a=21, b =2, c=undefined
  8. };
    大多数采用C语言语法的语言都拥有块级作用域。对于一个代码块,即包括在一对大括号中的语句,其中定义的所有变量在代码块的外部是不可见的。定义在代码块中的变量在代码块执行结束后会被释放掉。但是,对于JavaScript语言来说,虽然该语言支持代码块的语法形式,但是它并不支持块级作用域。

JavaScript支持函数作用域,定义在函数中的参数和变量在函数外部是不可见的,并且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见。
其他主流编程语言都推荐尽可能迟地声明变量,但是在JavaScript中就不能够这样,因为它缺少块级作用域,最好的做法是在函数体的顶部声明函数中可能用到的所有变量。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
面试5 如何理解静态变量,局部变量,全局变量
静态变量:在程序运行期间分配的固定的存储空间变量,称为静态变量。 局部变量:在一个函数的内部定义的内部变量,它只在本函数范围内部有效,只有在本函数内部才能使用,在本函数以为是不能进行使用的,称为局部变量。
611 0
thymeleaf 传递数据到js变量
thymeleaf 传递数据到js变量 如何把控制器传来的model中的值传递给js变量呢? 需要以下两个: var message = [[${message}]] 1.
2834 0
+关注
zhanginzaghi
IT菜鸟
90
文章
25
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载