关于《Learning JavaScript Design Patterns》中命令模式IIFE用法的疑问
问题解答
首先明确:书中的IIFE写法不是书写错误,属于示例简化省略了变量暴露的逻辑。
- 原IIFE中用
var定义的Manager属于函数作用域变量,默认仅在IIFE内部可访问,要在外部调用必须将其暴露到外层作用域,原示例是为了突出命令模式的核心实现,省略了暴露到全局的代码,补充挂载逻辑即可正常运行。 - 你提到的
CarManager是其他示例的命名差异,和此处的Manager实现逻辑完全一致,没有本质区别。 - 完整可运行的实现示例如下:
(function(){ var Manager = { foo: function (param) { console.log('foo 方法执行,入参:', param); }, bar: function (param) { console.log('bar 方法执行,入参:', param); } }; // 内部实现execute方法,所有逻辑封装在IIFE内部避免全局污染 Manager.execute = function ( name ) { return Manager[name] && Manager[name].apply( Manager, [].slice.call(arguments, 1) ); }; // 将Manager挂载到全局window,外部即可访问 window.Manager = Manager; })(); // 外部调用验证 const testParam = '测试参数'; Manager.execute("foo", testParam);
- 不同示例的差异仅为命令模式的不同落地形式:Addy的实现属于轻量化的命令调度,适合内部方法固定、不需要额外封装命令对象的场景;如果是采用独立命令对象的写法,更适合命令需要撤销、排队等复杂操作的场景,两种写法没有对错,只是适用场景不同。
内容的提问来源于stack exchange,提问作者nostyn
相关产品推荐
相关产品推荐

