在 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源

如何在 Chrome DevTools 检查器的样式和计算选项卡中使用多个过滤器?

检查包含 kendo-ui 样式的页面中的元素时,Google Chrome Devtools 崩溃

如何检查 chrome devtools 中的所有 cookie?

在 Chrome DevTools 网络查看器中取消选择 WebSocket 连接