JavaScript 更改控制台调用堆栈

Eli*_*ias 5 javascript browser callstack console.log

正确行为

当我console.log()直接从函数调用时,我调用的堆栈(函数和文件)在开发工具控制台中是正确的,正如预期的那样。

main.js

function main() {
    // Works correctly
    console.log('Hello from main()!');
}
Run Code Online (Sandbox Code Playgroud)

安慰:

Hello from main()!    ...    main.js:3                       
Run Code Online (Sandbox Code Playgroud)

我想要的是

现在,当我添加第二个文件debug.jsconsole.log从那里调用时,我调用的文件是debug.js,这是正确的...但我需要debug()像在main.js. 不知何故,我需要修改调用者、堆栈或跟踪来欺骗console.log()它是从 调用的main.js,而实际上是从deubg.js.

代码

debug.js

function debug(msg) {
   console.log(msg)
}
Run Code Online (Sandbox Code Playgroud)

main.js

function main() {
   debug('Hello world!') // debug() in debug.js
}
Run Code Online (Sandbox Code Playgroud)

行为

目前的行为:

function main() {
   debug('Hello world!') // debug() in debug.js
}
Run Code Online (Sandbox Code Playgroud)

我想要的行为:

Hello world!    ...    debug.js:2
Run Code Online (Sandbox Code Playgroud)

Bra*_*ell 5

我相信这里的问题是控制台日志通常从它运行的任何地方执行。但是,如果您要传回一个执行控制台日志的函数,这可能会如您所愿。你可以试试下面的代码吗?

尝试 #1

调试.js:

function debug(msg) {
   return (function(msg) { console.log(msg) })(msg)
}
Run Code Online (Sandbox Code Playgroud)

主要.js:

function main() {
   debug('Hello world!')
}
Run Code Online (Sandbox Code Playgroud)

如果这不起作用,你可以试试这个:

尝试#2

调试.js:

function debug() {
   return function(msg) { console.log(msg) }
}
Run Code Online (Sandbox Code Playgroud)

主要.js:

function main() {
   debug()('Hello world!')
}
Run Code Online (Sandbox Code Playgroud)