如果我在 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
};
})();
why is privateFunction1
在断点的范围内,同时privateFunction2
is not?
有趣的问题。
privateFunction2
is在范围内publicFunction
, but publicFunction
从未实际使用过它。我相信您在调试器中看到的内容是因为 V8(Chrome 的 JavaScript 引擎)出于各种原因(包括最小化内存使用)优化了闭包的内容。
理论上,根据规范,publicFunction
关闭(具有持久引用)其定义范围内的所有符号。具体来说,一个执行上下文是为调用最外面的匿名函数而创建的,并且该执行上下文有一个词汇环境与相关的绑定对象到哪个publicFunction
有一个隐式的、匿名的引用。该绑定对象具有(理论上)名称的属性publicFunction
, privateFunction1
, privateFunction2
,以及其他一些事情(arguments
等等)。
但问题是publicFunction
实际上没有引用任何东西,但是privateFunction1
,并且有了适当的代码,它cannot参考其他任何东西。为了让它引用其他任何东西,你必须更改它的代码,当然 V8 会做出不同的决定。代码在publicFunction
has no eval(string)
or new Function(string)
调用,因此 V8 可以自由地对其引用的符号进行静态分析。这意味着,如果没有调试器,绑定对象就没有必要保留这些其他属性。它们从未被使用过。
由于 V8 是一个积极优化的编译器(是的,编译器),显然它从执行上下文的绑定对象中删除了死属性。
如果我添加一些东西publicFunction
使用privateFunction2
对于任何事情,我都可以像我一样从控制台引用它privateFunction1
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)