javascript - 节点奇怪的堆栈跟踪
问题描述
如果我执行以下代码:
"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
还是bug?
解决方案
{config}
创建一个具有config
原始属性的对象config
。
堆栈似乎是:config
来自参数{config}
。所以“ run.{config}.config
”从run
,显然显示为run.config.config
。
fn
如果较早分配,则堆栈跟踪是不同的(因此,何时fn
不是匿名的)。
const config = {foo: 1, bar: 2};
const run = (fn, config) => {
fn(config);
};
const runFn = params => {
console.log(`current params: ${JSON.stringify(params)}`);
throw new Error("Caught ya'");
}
run(runFn, {config});
带有 fn 参数的 Nodejs 输出作为预定义的命名函数(上面的代码片段):
current params: {"config":{"foo":1,"bar":2}}
[...]\SO65523965.js:8
throw new Error("Caught ya'");
^
Error: Caught ya'
at runFn ([...]\SO65523965.js:8:11)
at run ([...]\SO65523965.js:3:3)
...
带有内联 fn 参数的 Nodejs 输出:
current params: {"config":{"foo":1,"bar":2}}
[...]\SO65523965.js:8
throw new Error("Caught ya'");
^
Error: Caught ya'
at run.config.config ([...]\SO65523965.js:13:11)
at run ([...]\SO65523965.js:3:3)