You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于《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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 09:36:00