Javascript 节点堆栈跟踪
如果我执行以下代码:Javascript 节点堆栈跟踪,javascript,node.js,v8,stack-trace,Javascript,Node.js,V8,Stack Trace,如果我执行以下代码: "use strict"; const config = {}; const run = (fn, params) => fn(params); run( params => { throw new Error("Simple test!"); }, { config } ); 我得到以下堆栈跟踪: Error: Simple test! at run.config.c
"use strict";
const config = {};
const run = (fn, params) => fn(params);
run(
params => {
throw new Error("Simple test!");
},
{ config }
);
我得到以下堆栈跟踪:
Error: Simple test!
at run.config.config (C:\test\test.js:10:9)
at run (C:\test\test.js:6:29)
at Object.<anonymous> (C:\test\test.js:8:1)
at Module._compile (internal/modules/cjs/loader.js:1133:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
at Module.load (internal/modules/cjs/loader.js:977:32)
at Function.Module._load (internal/modules/cjs/loader.js:877:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
at internal/main/run_main_module.js:18:47
错误:简单测试!
在run.config.config(C:\test\test.js:10:9)
运行时(C:\test\test.js:6:29)
反对。(C:\test\test.js:8:1)
at模块编译(内部/modules/cjs/loader.js:1133:30)
at Object.Module._extensions..js(internal/modules/cjs/loader.js:1153:10)
at Module.load(内部/modules/cjs/loader.js:977:32)
at Function.Module._load(内部/modules/cjs/loader.js:877:14)
在Function.executeUserEntryPoint[作为runMain](internal/modules/run_main.js:74:12)
在internal/main/run_main_module.js:18:47
让
run.config.config
是正常的还是一个bug?{config}
从原始config
创建一个属性为config
的对象
堆栈似乎是:config
from参数{config}
。因此,run
中的“run.{config}.config
”,显然显示为run.config.config
如果fn
更早分配(因此,当fn
不是匿名时),堆栈跟踪不同
const-config={foo:1,bar:2};
常量运行=(fn,配置)=>{
fn(配置);
};
常量runFn=params=>{
log(`current params:${JSON.stringify(params)}`);
抛出新错误(“抓到你了”);
}
run(runFn,{config})代码>
运行run.config.config是正常的还是一个bug
如果您指出不应该在堆栈跟踪中提到config
对象,因为它与错误无关,那么是的,这很奇怪,另一方面,如果您想知道config.config
,那么我怀疑:
多亏了
这:
常数a=1,b=2,c=3;
常量obj={a,b,c};
相当于:
常数a=1,b=2,c=3;
const obj={a:a,b:b,c:c};
以同样的方式,这:
run(参数=>{
抛出新错误(“简单测试!”);
},
{config}
);
相当于:
run(参数=>{
抛出新错误(“简单测试!”);
},
{config:config}
);
这可以解释config.config
部分,第一个config
似乎指的是对象{config:config}
,第二个(.config
)指的是所提到对象的config
属性名这看起来确实很奇怪。节点似乎为传递给run
的匿名回调派生了一个名称,不知道它是如何到达config
的。我想{config}
在原始config
中创建了一个新的config
属性,我可以在Chrome devtools控制台中重现它,所以它可能是一个V8thing@KooiInc不这只是一个对象文本,只有一个属性保存config
对象。未修改config
对象。无论如何,这并不能回答为什么DV的堆栈traceno中会出现config
对象,但不确定这是否真的回答了这个问题。但是对fn
的调用与config参数有什么关系?不确定,但请查看编辑后的答案。“奇怪”错误仅在fn
内联时显示,因此当fn
为匿名时显示。在这种情况下,我假设取了fn
的父名称,并从v8解释器中进行了一些奇怪的猜测。但是,如果您使用{config:config}
尝试代码,则在堆栈跟踪中只会得到run.config
。