1、 javascript 创建命名空间的 5 种写法在 javascript 中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:代码如下:var sayhello = function() return hello var;function sayhello(name) return hello function;sayhello();最终的输出为代码如下:hello var为什么会这样,根据 stackoverflow 的解释,实际上 javascript 的是按如下顺序解析的。代码如下:function sayhello(name) retur
2、n hello function;var sayhello = function() return hello var;sayhello();不带 var 的 function 声明被提前解析了,因此现代的 js 写法建议你始终使用前置 var 声明所有变量;避免全局变量名冲突的最好办法还是创建命名空间,下面是在 js 中合建命名空间的几种常用方法。一、通过函数(function) 创建这是一种比较常见的写法,通过声明一个 function 实现,函数里设置初始变量,公共方法写入 prototype,如:代码如下:var namespace = namespace | ;/*function*
3、/namespace.hello = function() this.name = world;namespace.hello.prototype.sayhello = function(_name) return hello + (_name | this.name);var hello = new namespace.hello();hello.sayhello();这种写法比较冗长,不利于压缩代码(jquery 使用 fn 代替 prototype) ,而且调用前需要先实例化(new)。使用 object 写成 json 形式可以写得紧凑些:二、通过 json 对象创建 object代码
4、如下:/*object*/var namespace = namespace | ;namespace.hello = name: world, sayhello: function(_name) return hello + (_name | this.name);调用代码如下:namespace.hello.sayhello(js);hello js;这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加 this 指示作用域,写法也略有冗余。三、通过闭包(closure)和 object 实现在闭包中声明好所有变量和方法,并通过一个 json
5、 object 返回公有接口:代码如下:var namespace = namespace | ;namespace.hello = (function() /待返回的公有对象var self = ;/私有变量或方法var name = world;/公有方法或变量self.sayhello = function(_name) return hello + (_name | name);/返回的公有对象return self;();四、object 和闭包的改进型写法上个例子在内部对公有方法的调用也需要添加 self,如:self.sayhello() ; 这里可以最后再返回所有公有接口(方法
6、/变量)的 json 对象。代码如下:var namespace = namespace | ;namespace.hello = (function() var name = world;var sayhello = function(_name) return hello + (_name | name);return sayhello: sayhello;();五、function 的简洁写法这是一种比较简洁的实现,结构紧凑,通过 function 实例,且调用时无需实例化( new) ,方案来自 stackoverflow:代码如下:var namespace = namespace | ;namespace.hello = new function() var self = this;var name = world;self.sayhello = function(_name) return hello + (_name | name);欢迎补充。