可以这样定义模块:
(function(ns, required){
})(window, base);
在上面的代码中使用一个匿名立即执行函数来限定代码的作用域在匿名函数内,用来封模块装逻辑并避免全局命名空间污染。其中ns表示命名空间,required表示依赖的模块。模块通过ns[name] = name; 这样导出,供外部使用。
我们将全局对象作为参数传入匿名函数,这样写的目有两个:一方面可以使我们一眼就看出来模块使用了那些全局对象;另一方面因为在Javascript中访问局部变量不需要遍历 作用域链所以性能会比访问访问全局变量更高。
这样写注释:
//class TabView {
/**
* function TabView(tabs, panels) : void
* 选项卡切换控件
* @param {Array} tabs 切换选项卡
* @param {Array} panels 内容显示面板
* @param {Number} selected 默认选择的选项索引
*/
function TabView(tabs, panels, selected){
this.tabs=tabs;
this.panels=panels
}
/*其他代码*/
//}
这样写的目有两个:
- 一是告诉调用者这个函数需要new func(),不能func()这样直接调用,
- 二是标识伪类的开始和结束方便查阅代码,大括号接近JS 和C#的开始结束代码块风格,可以一眼看上去就知道定义的开始和结束。
结合在一起后的代码:
看起来类似这样:
(function(ns, base){
//class TabView {
/**
* function TabView(tabs, panels) : void
* 选项卡切换控件
* @param {Array} tabs 切换选项卡
* @param {Array} panels 内容显示面板
* @param {Number} selected 默认选择的选项索引
*/
function TabView(tabs, panels, selected){
this.tabs=tabs;
this.panels=panels
}
/*其他代码*/
//}
ns["TabView"] = TabView;
})(window, base);