Function.prototype.bindAs = function(operator){ var me = this; return function(){ var args = [me].concat([].slice.call(arguments, 0)); return operator.apply(null, args); }; }; var createFuse = function(){ var queue, fn, infire; queue = []; fn = function(process){ var args = [].slice.call(arguments, 1); if(infire) process.apply(null, args); else queue.push(function(){ process.apply(null, args); }); }; fn.fire = function(){ while(queue.length) queue.shift()(); infire = true; }; return fn; }; // 导火线模型的应用部分,从这里看起 var swfReady = createFuse(); // 创建一根导火线(在实际的复杂项目中,可根据需要任意创建多个) var store = { set: function(name, value){ window.alert(["set", name, value]); }.bindAs(swfReady), // 把 set 接口挂到导火线上 get: function(name){ // TODO: }, remove: function(name){ window.alert(["remove", name]); }.bindAs(swfReady) // 把 remove 接口也挂到导火线上 }; // 这里模拟用户的一堆随意调用 store.set("name", "dron"); store.set("sex", "boy"); store.remove("sex"); store.set("age", 18); setTimeout(function(){ // 这里延迟两秒,模拟 flash 加载完成 swfReady.fire(); // 由 flash 加载完成触发的导火线点火,这一步,你将看到上边一堆 set,remove 的效果了(alert) store.set("sex", "girl"); // 这一句,说明了被挂到导火线上的接口,在点火完成后,仍然可以工作,当然不需要再次点火 }, 2000);