在 chrome devtools 中检查 node.js 时函数语句的奇怪行为
Posted
技术标签:
【中文标题】在 chrome devtools 中检查 node.js 时函数语句的奇怪行为【英文标题】:function statement's strange behavior when inspecting node.js in chrome devtools 【发布时间】:2018-04-09 16:36:57 【问题描述】:我使用 chrome devtools 来调试 node.js 脚本(node --inspect script.js
,例如在
https://nodejs.org/en/docs/guides/debugging-getting-started/)
由于某种原因,函数语句无法正常工作。这是代码:
function f();
f=1;
console.log(f);
http = require('http');
myserver=http.createServer(function (req, res)
res.end();
).listen(8080);
控制台输出 1
,但是当我尝试在控制台中输入 f
时,它显示“未捕获的 ReferenceError:f 未定义”。
如果我使用函数表达式而不是函数语句,则一切正常:
f=function();
f=1;
console.log(f);
http = require('http');
myserver=http.createServer(function (req, res)
res.end();
).listen(8080);
所以我想知道问题的根源是什么以及如何解决它。
附:脚本的 createServer 部分是我使用的一个技巧,以便在脚本执行后 chrome devtools 控制台仍在运行。顺便问一下,有没有更直接的方法呢?
更新:
我偶然发现了另一种方法,它在函数语句中没有这个问题:
node --inspect -e "$(< script.js)"
【问题讨论】:
setInterval(() => 0, 10000)
谢谢。顺便说一句:node -i -e "$(< script.js)"
即使没有这个 setInterval/createServer 技巧,也能很好地运行(运行脚本时函数语句没有问题并打开节点 repl(就在终端中))。 node --inspect -e "$(< script.js)"
在 chrome devtools 控制台中运行良好,但仍需要 setInterval/createServer 技巧。
【参考方案1】:
第一个脚本声明是模块范围内的局部变量,它用函数初始化,然后分配1
,然后垃圾收集 - 服务器关闭不使用它,请参阅Why does Chrome debugger think closed local variable is undefined?。
第二个脚本没有声明任何变量1,它确实分配给一个全局2。首先是函数,然后是值 1
,但全局变量不能被垃圾回收,因为稍后运行的任何代码仍可能访问它们。
[1]:使用var f
可能会导致与第一个脚本相同的结果。[2]:始终使用"use strict"
mode!你会得到一个适当的例外。
【讨论】:
谢谢!您能否检查您的第二个链接:它与您的第一个链接相同。 @GrigoryHatsevich 谢谢,已修复。当我用胖手指 Ctrl+C 时会发生这种情况:-/以上是关于在 chrome devtools 中检查 node.js 时函数语句的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章
在 chrome devtools 中检查 node.js 时函数语句的奇怪行为
如何在 Chrome DevTools 检查器的样式和计算选项卡中使用多个过滤器?
检查包含 kendo-ui 样式的页面中的元素时,Google Chrome Devtools 崩溃