如何定位到一个 JS Function 的代码行数,用于一些提升 Debug 场景体验。

  • console.trace()
  • new Error().stack

获取调用方

function main() {
  method();
}

function method() {
  console.log(arguments.callee.caller);
}

main();

基本操作

劣势是:目前找不到能拿到其输出的方式(直接输出至 web console,无法截获其输出用来分析)


function main() {
  method();
}

function method() {
  console.trace();
}

main();

如图:

基本操作之二

劣势是:需要手动输入或注入 Error


function main() {
  method();
}

function method() {
  console.log(new Error().stack);
}

main();

如图:

小技巧

通过注入对象,使其报错截获

function a(b) {
  console.log(b.a)
}

a(new Proxy({}, {
  get: (target, prop, receiver) => {
    console.log(new Error().stack)
  }
}))

或者内部使用 this 的情况下,使用 .call(Proxy) 并在外部 try catch 即可

但如果内部没有任何外部变量的使用,可以使其报错,那么暂时无解。

参考

  • https://stackoverflow.com/questions/6715571/how-to-get-result-of-console-trace-as-string-in-javascript-with-chrome-or-fire
  • https://developer.mozilla.org/en-US/docs/Web/API/console/trace
  • https://stackoverflow.com/questions/280389/how-do-you-find-out-the-caller-function-in-javascript
  • https://developer.mozilla.org/en-US/docs/Web/API/console/trace