Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

「避免使用全局变量」

  「避免使用全局变量」这句话本身是正确的,而且无论在任何编程语言中都适用。但这句话并不严谨,因为全局变量的定义不明确。于是很多情况下这句话就被钻了空子,人们总是用一堆自欺欺人的方式来避开全局变量,但是最终并没有解决任何问题。
  就说 JavaScript 吧,全局变量是什么?大概就是 global 上定义的变量了吧?那么如何「避免使用全局变量」呢?我曾经看到过有人为了避免使用太多全局变量,于是在全局创建了个对象,把本该是全局变量的东西全部丢在这个全局对象里。会产生这样让人哭笑不得的做法就是因为没有读懂「避免使用全局变量」这句话。
  这样真的「避免使用全局变量」了么?我觉得这是掩耳盗铃的做法。我不是说在全局放一个对象来存储东西的做法不好,而是放一个对象后把本该是全局变量的东西全都丢进去这个行为不好。我可能会在全局放很多个对象,有的用来存文案常量、有的用来存配置路径,诸如此类。像这样就变量分组存放的做法是没有任何问题了。全部丢在一个对象中和全部丢在全局基本没区别。
  「避免使用全局变量」的目的是什么?因为全局作用域是大家都能访问的,所以很可能出现变量名冲突的情况。其实全局变量也不仅仅指「声明在全局作用域的」,甚至未必要是一个「变量」。比如一个函数作用域内有很多子作用域,那么这个函数作用域中声明的变量相对于其子作用域而言就是全局变量概念,因为有很多相对局部的程序都可以通用它。又比如 localStorage 虽然不算是变量,但它也是一种全局存储,甚至比一般的 JavaScript 全局变量更具「全局」的概念,所以同样的规则也适用于 localStorage。
  其实把上面的影响总结一下就可以重新得出一个目的「避免子模块之间的数据共享,降低程序耦合」。子模块之间的数据共享就不该由父模块来管理,或者即便出现了模块间的数据共享需求也应该将共享数据做成一个新的同级模块来管理,因为同级模块之间的依赖关系远比变量好管理得多。
网名:
3.80.55.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^