命名空间+闭包+全局变量实例
来源:互联网 发布:移民文案知乎 编辑:程序博客网 时间:2024/05/17 13:11
var sayHello = function() { return 'Hello var';};function sayHello(name) { return 'Hello function';};sayHello();
最终的输出为
> "Hello var"
为什么会这样,根据 StackOverFlow 的解释,实际上JavaScript的是按如下顺序解析的。
function sayHello(name) { return 'Hello function';};var sayHello = function() { return 'Hello var';};sayHello();
不带var的function声明被提前解析了,因此现代的JS写法建议你始终使用前置var声明所有变量;
避免全局变量名冲突的最好办法还是创建命名空间,下面是在JS中合建命名空间的几种常用方法。
通过函数(function)创建
这是一种比较常见的写法,通过声明一个function实现,函数里设置初始变量,公共方法写入prototype,如:
var NameSpace = window.NameSpace || {};/*Function*/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
/*Object*/var NameSpace = window.NameSpace || {};NameSpace.Hello = { name: 'world' , sayHello: function(_name) { return 'Hello ' + (_name || this.name); }};
调用
NameSpace.Hello.sayHello('JS');> Hello JS;
这种写法比较紧凑,缺点是所有变量都必须声明为公有(public)的,导致所有对这些变量的引用都需要加this指示作用域,写法也略有冗余。
在闭包中声明好所有变量和方法,并通过一个JSON Object返回公有接口:
var NameSpace = window.NameSpace || {};NameSpace.Hello = (function() { //待返回的公有对象 var self = {}; //私有变量或方法 var name = 'world'; //公有方法或变量 self.sayHello = function(_name) { return 'Hello ' + (_name || name); }; //返回的公有对象 return self;}());
Object和闭包的改进型写法
上个例子在内部对公有方法的调用也需要添加self,如:self.sayHello(); 这里可以最后再返回所有公有接口(方法/变量)的JSON对象。
var NameSpace = window.NameSpace || {};NameSpace.Hello = (function() { var name = 'world'; var sayHello = function(_name) { return 'Hello ' + (_name || name); }; return { sayHello: sayHello };}());
Function的简洁写法
这是一种比较简洁的实现,结构紧凑,通过function实例,且调用时无需实例化(new),方案来自stackoverflow:
var NameSpace = window.NameSpace || {};NameSpace.Hello = new function() { var self = this; var name = 'world'; self.sayHello = function(_name) { return 'Hello ' + (_name || name); };};
调用
NameSpace.Hello.sayHello();
0 0
- 命名空间+闭包+全局变量实例
- jQuery 命名空间、闭包
- 全局变量、有效域、命名空间
- Day21-命名空间与闭包
- 关于命名空间和闭包
- Java包*命名空间
- 包和命名空间
- 包与命名空间
- extern 用法,在命名空间全局变量用到
- extern 用法,在命名空间全局变量用到
- Javascript 定义命名空间,减少全局变量污染
- 命名空间 extern的用法 static全局变量
- 什么是包和命名空间
- struts包和命名空间
- js中全局变量与局部变量实例、闭包
- 全局变量,extern和static以及命名空间的区别
- 全局变量,extern和static以及命名空间的区别
- Node.js 全局变量命名空间与命名空间中require模块的冲突
- JAVA基础三——安卓开发的基础
- Ubuntu下搭建AndroidStudio开发环境
- BP神经网络介绍
- java中常用的字符串的截取方法1
- Mina的IoBuffer类getSlice方法略坑
- 命名空间+闭包+全局变量实例
- usaco布局(差分约束系统的应用)
- SpringMVC 使用验证框架 Bean Validation(下)
- MyEclipse注册码生成器
- maven多模块工程打包部署
- treap模板
- jxl怎样使用自定义颜色设置单元格颜色
- javascript笔记
- SDCC 的源码安装