1、命名冲突
2、代码的脆弱性
如果全局变量不存在,那么使用全局变量的部分就失效甚至是报错。同样,任何函数如果不经意间修改了全局变量,导致全局变量值的依赖变得不稳定。
3、难以测试
4、当你给一个未被var语句声明过的变量赋值时,javascript会自动创建一个全局变量。比如:
function doSomething(){
var count = 10; // 局部变量
title = 'Martain Luderking'; // 创建了全局变量
}
如果上面的例子中count和全局变量同名,那么函数内使用的count是局部变量的count,如果要是用全局变量中的count,要显式地使用window.count来访问全局变量count。
如果全局变量中已经存在了title,那么上述例子中,则修改了全局变量title的值。
5、最好的规则就是总是使用var来定义变量,这样能降低某些场景省略了var所导致错误的可能性。
6、使用命名空间
团队内部进行协同开发的时候,如果涉及到Javascript代码,可能会遇到函数名和类名冲突的情况。这时团队可以进行一些命名约定,比如在函数名前加相应的前缀区别,类似google ig的api中使用的_IG_FetchXmlContent(),_IG_RegisterOnloadHandler()等。另外也可以引入命名空间的概念,但是Javascript原生并不支持命名空间,需要变通来实现。
在Javascript中,所有的对象(或者称类型,例如Boolean,Array,Function)都可以认为是一个关联数组。关联数组中的 对象可以使用点(.)进行引用,这样我们可以利用关联数组变相地实现命名空间。首先声明一个关联数组作为根,因为页面声明的对象都是window这个变量 的成员,所以一般命名空间的实现都以window为根。当向window申请a.b.c的命名空间时,首先在window中查看是否存在a这个成员,如果 没有则在window下新建一个名为a的空关联数组,如果已经存在a,则继续在window.a中查看b是否存在,以此类推。
(以上内容来源:http://panweizeng.com/javascript-namespace.html)
具体可以参考的方法和解释:http://www.cnblogs.com/dolphinX/p/3269145.html
基本的用法为:
(function(){ var _NS=function(){ } _NS.prototype.alert=function(){ console.log('test'); } window.NS=new _NS(); })();
7、使用模块
8、零全局变量