如何获取JavaScript调用者函数行号?如何获取JavaScript调用者源URL?

Tal*_*Tal 103 javascript

我使用以下内容来获取JavaScript调用者函数名称:

var callerFunc = arguments.callee.caller.toString();
callerFuncName = (callerFunc.substring(callerFunc.indexOf("function") + 8, callerFunc.indexOf("(")) || "anoynmous")
Run Code Online (Sandbox Code Playgroud)

有没有办法发现调用该方法的行号?

另外,有没有办法获取调用该方法的JavaScript文件的名称?还是源URL?

小智 90

这适用于chrome/QtWebView

function getErrorObject(){
    try { throw Error('') } catch(err) { return err; }
}

var err = getErrorObject();
var caller_line = err.stack.split("\n")[4];
var index = caller_line.indexOf("at ");
var clean = caller_line.slice(index+2, caller_line.length);
Run Code Online (Sandbox Code Playgroud)

  • 不需要抛出错误; 简单地创建它就足够了:`var caller_line =(new Error).stack.split("\n")[4]` (55认同)
  • 将此建议与另一个类似的答案合并,以获得FF/Webkit"标准化"响应 - 请参阅http://stackoverflow.com/a/14841411/1037948 (2认同)
  • @ELLIOTTCABLE 实际上,在某些浏览器(例如 iOS safari)中,您确实需要抛出异常!那么为什么不这样做呢? (2认同)

Eli*_*rey 24

kangax的解决方案引入了不必要的try..catch范围.如果您需要访问JavaScript中的某些行号(只要您使用的是Firefox或Opera),只需访问即可(new Error).lineNumber.

  • 这是勾选,但不回答问题,即如何获取**调用函数**的行号. (82认同)
  • 嗨,谢谢你的插件.你知道它是否有可能从之前的电话号码获得行号?假设方法A调用B,现在在BI中想知道在A下的哪一行调用了? (11认同)
  • 而且,这是非常有限的.最好的解决方案是抛出错误并在error.stack上使用正则表达式,这在所有现代浏览器中都可用.您可以轻松提取该路径,文件,行和列.没问题. (2认同)

Rya*_*yan 10

我很惊讶大多数这些答案都假设您想要处理错误而不仅仅是为正常情况输出有用的调试跟踪.

例如,我喜欢使用这样的console.log包装器:

consoleLog = function(msg) {//See https://stackoverflow.com/a/27074218/470749
    var e = new Error();
    if (!e.stack)
        try {
            // IE requires the Error to actually be thrown or else the 
            // Error's 'stack' property is undefined.
            throw e;
        } catch (e) {
            if (!e.stack) {
                //return 0; // IE < 10, likely
            }
        }
    var stack = e.stack.toString().split(/\r\n|\n/);
    if (msg === '') {
        msg = '""';
    }
    console.log(msg, '          [' + stack[1] + ']');        
}
Run Code Online (Sandbox Code Playgroud)

这最终会将以下输出打印到我的控制台:

1462567104174 [getAllPosts@http://me.com/helper.js:362:9]

请参阅/sf/answers/1895195291/以及具有正确行号的console.log的正确包装器?


Jap*_*eva 7

我意识到这是一个老问题,但现在有一个方法被调用console.trace("Message"),它会向您显示行号和导致日志的方法调用链以及您传递的消息。有关 javascript 日志记录技巧的更多信息,请访问freecodecamp这篇中等博客文章


kan*_*gax 5

这通常是通过从当前上下文中抛出错误来实现的;然后分析错误对象的属性,如lineNumberfileName(某些浏览器具有)

function getErrorObject(){
  try { throw Error('') } catch(err) { return err; }
}

var err = getErrorObject();

err.fileName;
err.lineNumber; // or `err.line` in WebKit
Run Code Online (Sandbox Code Playgroud)

不要忘记该callee.caller属性已被弃用(并且从未真正出现在 ECMA 第 3 版中。首先)。

还要记住,函数反编译被指定为依赖于实现,因此可能会产生非常意外的结果。我在这里这里写过它。