调试显露的模块模式:在范围上并不功能,直到叫什么名字?(Debugging Revealing Mo

2019-07-19 19:46发布

如果我运行Chrome开发者工具中的代码:

var test = (function () {

  var publicFunction,
      privateFunction1,
      privateFunction2;

  privateFunction1 = function privateFunction1() {
    return true;
  };

  privateFunction2 = function privateFunction2() {
    return true;
  };

  publicFunction = function publicFunction() {
    privateFunction1();
    debugger;
  };

  return {
    publicFunction: publicFunction
  };
})();

为什么privateFunction1在断点范围,而privateFunction2是不是?

Answer 1:

有趣的问题。

privateFunction2所在范围publicFunction ,但publicFunction从来没有真正使用它。 我相信你所看到的在调试器是因为V8(Chrome的JavaScript引擎)优化关闭因各种原因(包括尽量减少内存使用)的内容。

在理论上,根据本说明书中, publicFunction关闭在(具有持久参照)其中,它被定义在范围内的所有符号。 具体而言, 执行上下文被用于该呼叫到您的最外的匿名函数创建的,并且执行上下文具有词法环境具有相关联的结合对象 ,其publicFunction有一个隐式的,匿名参考。 该绑定对象有(理论上)的名字就可以了性能publicFunctionprivateFunction1privateFunction2 ,以及一些其他的东西( arguments和等)。

但事实是, publicFunction实际上并没有引用任何东西,但privateFunction1 ,并在地方它的代码,它不能引用任何东西。 它引用别的,你就必须改变它的代码,当然他们的V8会做出不同的决定。 在代码publicFunction没有eval(string)new Function(string)调用,因此V8是免费做一个静态的分析它所引用的符号。 这意味着,,在没有调试器,没有任何点到保持那些其它性质的结合对象。 他们从来没有使用过。

由于V8是一个积极优化编译器(是的,编译器),显然它会从执行上下文的绑定对象死性质。

如果我添加了一些publicFunction使用privateFunction2什么,然后我就可以参考它从控制台就像我可以privateFunction1



文章来源: Debugging Revealing Module Pattern: functions not in scope until called?