• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

JavaScript创建命名空间的5种写法_php技巧

php 搞代码 4年前 (2022-01-26) 45次浏览 已收录 0个评论

在JavaScript中全局变量经常会引起命名冲突,甚至有时侯重写变量也不是按照你想像中的顺序来的,可以看看下面的例子:

<br />var sayHello = funct<b>%本文@来源gao@!dai!ma.com搞$$代^@码!网</b><strong>搞代gaodaima码</strong>ion() {<br />  return 'Hello var';<br />};</p><p>function sayHello(name) {<br />  return 'Hello function';<br />};</p><p>sayHello();<br />

最终的输出为

<br />> "Hello var"<br />

为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是按如下顺序解析的。

<br />function sayHello(name) {<br />  return 'Hello function';<br />};</p><p>var sayHello = function() {<br />  return 'Hello var';<br />};</p><p>sayHello();<br />

不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量;

避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法。

一、通过函数(function)创建

这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:

<br />var NameSpace = NameSpace || {};<br />/*<br />Function<br />*/<br />NameSpace.Hello = function() {<br />  this.name = 'world';<br />};<br />NameSpace.Hello.prototype.sayHello = function(_name) {<br />  return 'Hello ' + (_name || this.name);<br />};<br />var hello = new NameSpace.Hello();<br />hello.sayHello();<br />

这种写法比较冗长,不利于压缩代码(jQuery使用fn代替prototype),而且调用前需要先实例化(new)。使用Object写成JSON形式可以写得紧凑些:

二、通过JSON对象创建Object

<br />/*<br />Object<br />*/<br />var NameSpace = NameSpace || {};<br />NameSpace.Hello = {<br />    name: 'world'<br />  , sayHello: function(_name) {<br />    return 'Hello ' + (_name || this.name);<br />  }<br />};<br />

调用

<br />NameSpace.Hello.sayHello('JS');<br />> Hello JS;

这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。

三、通过闭包(Closure)和Object实现

在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:

<br />var NameSpace = NameSpace || {};<br />NameSpace.Hello = (function() {<br />  //待返回的公有对象<br />  var self = {};<br />  //私有变量或方法<br />  var name = 'world';<br />  //公有方法或变量<br />  self.sayHello = function(_name) {<br />    return 'Hello ' + (_name || name);<br />  };<br />  //返回的公有对象<br />  return self;<br />}());<br />

四、Object和闭包的改进型写法

上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。

<br />var NameSpace = NameSpace || {};<br />NameSpace.Hello = (function() {<br />  var name = 'world';<br />  var sayHello = function(_name) {<br />    return 'Hello ' + (_name || name);<br />  };<br />  return {<br />    sayHello: sayHello<br />  };<br />}());

五、Function的简洁写法

这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:

<br />var NameSpace = NameSpace || {};<br />NameSpace.Hello = new function() {<br />  var self = this;<br />  var name = 'world';<br />  self.sayHello = function(_name) {<br />    return 'Hello ' + (_name || name);<br />  };<br />};<br />

欢迎补充。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:JavaScript创建命名空间的5种写法_php技巧

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址