模块模式利用了函数作用域和闭包来创建被绑定对象与私有成员变量的关联,只有特权函数才能够访问特定的私有成员变量(数据对象)。
模块模式(摈弃全局变量的使用,封装程序)的一般形式是:
一个定义了私有变量和函数的函数;
利用闭包创建可以访问私有变量和函数的特权函数;
最后返回这个特权函数,或者把它们保存到一个可以访问到的地方。
//糟糕得例子——预期点击一个节点时应输出节点的序号,但是这个总是会显示节点的数目(因为事件处理器函数绑定了变量i本身,而不是函数在构造时的变量i的值)
var add_the_handlers = function(nodes){
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick = function(e){ console.log(i); }
}
}
//先在循环外创建个辅助函数,这个辅助函数再返回一个绑定了当前i值的函数
var add_the_handlers = function(nodes){
var helper = function(i){
return function(e){ console.log(I); }
}
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick = helper(i);
}
};