【发布时间】:2014-06-05 20:24:26
【问题描述】:
步骤:
-
在 Firefox 29.0.1 (Windows 7 x64) 中打开页面:
<!doctype html> <title>Test</title> <script> (function () { var x = 5, f = function () { setTimeout(f, 1000); }; f(); }()); </script> 打开开发者工具 (F12)。
在调试器中,设置断点:
setTimeout(f, 1000);-
一旦断点被命中,在控制台中评估
x。结果:undefined 重新加载页面。断点在
f的第一次运行时命中。评估
x。结果:5继续执行,当再次命中断点时,评估
x。结果相同:5
我的假设:如果 Firefox 在第一次运行 f 时意识到不需要 x,那么它不会存储 x "with" f 的值.所以在随后对f 的调用中,x 的值是undefined。有趣的是,我在 Chrome 35 和 IE11 中看到了相同的行为。
问题: 发生了什么事?我可以配置 Firefox 以使 x 在第 4 步中评估为正确的值吗(见上文)?
【问题讨论】:
-
x仅存在于您的函数中,并且您正尝试从外部访问它。 -
我没有遇到这个问题。当我踏入它时,它的评估是正确的。 Fox 23.0.1 内置开发工具。如果您加载页面、启动调试器并尝试从那里进行调试,我会遇到调试器无法正常工作的情况。我以前必须加载页面、加载调试器、刷新页面才能使其工作。
-
@Meredith 我正在从
setTimeout(f, 1000);上的断点访问x,它位于函数的内部。 -
@JoeSwindell 我实际上是在谈论内置的开发工具,而不是 Firebug。对不起,我把名字弄错了。无论如何,在打开开发工具的情况下重新加载页面并不能解决我的问题。要触发该问题,重要的是不在加载页面时设置断点。
-
@feklee 如果没有断点,您将尝试从定义它的范围之外访问 x。 function() 包装器确保 x 未定义在页面的主范围内。如果您删除了外部函数包装器,则会定义 x。
标签: javascript firefox closures firefox-developer-tools