Mat*_*och 78 javascript line-numbers
JavaScript是否有一种机制来确定当前正在执行的语句的行号(如果是,它是什么)?
z5h*_*z5h 56
var thisline = new Error().lineNumber
如果这在您使用的任何环境中都不起作用,您可以尝试:
var stack = new Error().stack
然后通过堆栈搜索行号.
bal*_*ena 28
您可以使用
function test(){
console.trace();
}
test();
Run Code Online (Sandbox Code Playgroud)
jwa*_*att 23
在不同的浏览器和浏览器版本之间更容易移植(应该可以在Firefox,Chrome和IE10 +中使用):
function ln() {
var e = new Error();
if (!e.stack) try {
// IE requires the Error to actually be throw 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/);
// We want our caller's frame. It's index into |stack| depends on the
// browser and browser version, so we need to search for the second frame:
var frameRE = /:(\d+):(?:\d+)[^\d]*$/;
do {
var frame = stack.shift();
} while (!frameRE.exec(frame) && stack.length);
return frameRE.exec(stack.shift())[1];
}
Run Code Online (Sandbox Code Playgroud)
你可以尝试解析一个函数的源来寻找一些标记。
这是一个简单的例子(是的,它有点混乱)。
function foo()
{
alert(line(1));
var a;
var b;
alert(line(2));
}
foo();
function line(mark)
{
var token = 'line\\(' + mark + '\\)';
var m = line.caller.toString().match(
new RegExp('(^(?!.*' + token + '))|(' + token + ')', 'gm')) || [];
var i = 0;
for (; i < m.length; i++) if (m[i]) break;
return i + 1;
}
Run Code Online (Sandbox Code Playgroud)