命名空间是为了防止全局命名空间污染而将函数和属性作为命名变量的属性来定义。命名空间可使js更加‘模块化’,方便代码重用。
一般来讲,模块是一个独立的JS文件。模块文件可以包含一个类定义、一组相关类、一个实用函数库或者一些待执行的代码。理想状态下,所有模块都不应当定义超过一个全局标识。一旦将代码模块化,就需要一些方法导出公用API,以便在模块函数外部调用它们。
命名空间是使用单个全局变量来把所有的代码包含在一个函数内,由此来创建私有的命名空间和闭包作用域。通过全局作用域来实现的模块方法有CommonJS AMD。CommonJS 通过 module.exports 语句来导出对象为模块,再通过 require 语句来引入。(PS:exports是对module.exports的引用)。CommonJS可以明确表示模块之间的依赖关系,想异步加载则需要运用AMD。
AMD代码:
define(['myModule', 'myOtherModule'], function(myModule, myOtherModule) {
console.log(myModule.hello());
});
使用 define 方法,第一个参数是依赖的模块,这些模块都会在后台无阻塞地加载,第二个参数则作为加载完毕的回调函数。回调函数将会使用载入的模块作为参数。这些模块本身也需要通过 define 关键词来定义。
例如myModule:
define([], function() {
return {
hello: function() {
console.log('hello');
},
goodbye: function() {
console.log('goodbye');
}
};
});
ES6 的模块功能汲取了CommonJS 和 AMD 的优点,拥有简洁的语法并支持异步加载
一个按钮监听多个事件:
$(".ele")
.on('click',dosomething)
.on('click',dosomethingelse)
onclick方法新的监听会覆盖旧的
解绑的时候,$(".ele").off("click")会解绑所有事件监听;
单独解绑一个需要跟on相同传参$(".ele").off("click",dosomething);
但是如果函数名字不清楚或者是匿名函数,可为click指定一个命名空间,然后监听这个命名空间里的click函数,
即
$(".ele")
.on('click.myNameSpace',function(){
console.log("12")
})
解绑时:$(".ele").off('click.myNameSpace');
$.fn是指jquery的命名空间,加上fn上的方法及属性,会对jquery实例每一个有效。