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)
Eli*_*rey 24
kangax的解决方案引入了不必要的try..catch范围.如果您需要访问JavaScript中的某些行号(只要您使用的是Firefox或Opera),只需访问即可(new Error).lineNumber
.
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的正确包装器?
我意识到这是一个老问题,但现在有一个方法被调用console.trace("Message")
,它会向您显示行号和导致日志的方法调用链以及您传递的消息。有关 javascript 日志记录技巧的更多信息,请访问freecodecamp和这篇中等博客文章
这通常是通过从当前上下文中抛出错误来实现的;然后分析错误对象的属性,如lineNumber
和fileName
(某些浏览器具有)
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 版中。首先)。
还要记住,函数反编译被指定为依赖于实现,因此可能会产生非常意外的结果。我在这里和这里写过它。
归档时间: |
|
查看次数: |
105517 次 |
最近记录: |