如果我运行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
是不是?
有趣的问题。
privateFunction2
所在范围内publicFunction
,但publicFunction
从来没有真正使用它。 我相信你所看到的在调试器是因为V8(Chrome的JavaScript引擎)优化关闭因各种原因(包括尽量减少内存使用)的内容。
在理论上,根据本说明书中, publicFunction
关闭在(具有持久参照)其中,它被定义在范围内的所有符号。 具体而言, 执行上下文被用于该呼叫到您的最外的匿名函数创建的,并且执行上下文具有词法环境具有相关联的结合对象 ,其publicFunction
有一个隐式的,匿名参考。 该绑定对象有(理论上)的名字就可以了性能publicFunction
, privateFunction1
, privateFunction2
,以及一些其他的东西( arguments
和等)。
但事实是, publicFunction
实际上并没有引用任何东西,但privateFunction1
,并在地方它的代码,它不能引用任何东西。 它引用别的,你就必须改变它的代码,当然他们的V8会做出不同的决定。 在代码publicFunction
没有eval(string)
或new Function(string)
调用,因此V8是免费做一个静态的分析它所引用的符号。 这意味着,,在没有调试器,没有任何点到保持那些其它性质的结合对象。 他们从来没有使用过。
由于V8是一个积极优化编译器(是的,编译器),显然它会从执行上下文的绑定对象死性质。
如果我添加了一些publicFunction
使用privateFunction2
什么,然后我就可以参考它从控制台就像我可以privateFunction1
。