// 使用单例模式,创建一个用于管理全局状态的模块 var module_status = (functionmodule_status() { var status = { number: 0, color: null, };
var get = function (prop) { return status[prop]; // 访问闭包对象 Closure(module_status) 的属性 };
var set = function (prop, value) { status[prop] = value; // 设置闭包对象 Closure(module_status) 的属性 };
return { get: get, set: set, }; })();
// 负责改变颜色的模块 var module_color = (functionmodule_color() { // 假装用这种方式引入模块 类似于 import state from 'module_status'; var state = module_status; var colors = ['orange', '#ccc', 'pink'];
functionrender() { var color = colors[state.get('number') % 3]; // 访问闭包对象 Closure(module_status) 的 number 属性 document.body.style.backgroundColor = color; }
return { render: render, }; })();
// 负责显示当前number的模块 var module_context = (functionmodule_context() { var state = module_status;
functionrender() { console.log('this Number is '); // 小提示(与主逻辑无关): render[[scopes]]]作用域信息在解析这个函数时就已经确定了。执行到这里时 Closure(module_context) 就已经产生了 document.body.innerHTML = 'this Number is ' + state.get('number'); // 执行闭包对象 Closure(module_status) 的 get 方法, }
return { render: render, }; })();
// 主模块 var module_main = (functionmodule_main() { var state = module_status; // 保存 module_status 模块返回的字面量对象的引用 var color = module_color; var context = module_context;