JavaScript には、現在実行中のステートメントの行番号を決定するメカニズムがありますか (もしそうなら、それは何ですか)?
質問する
72578 次
8 に答える
77
var thisline = new Error().lineNumber
使用している環境でそれが機能しない場合は、次を試すことができます。
var stack = new Error().stack
次に、スタックを調べて行番号を探します。
于 2010-02-26T17:08:48.000 に答える
28
異なるブラウザーやブラウザー バージョン間での移植性が少し向上しました (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];
}
于 2014-11-22T04:58:20.217 に答える
5
関数のソースを解析して、いくつかのマークを探すことができます。
簡単な例を次に示します (はい、少し混乱しています)。
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;
}
于 2010-02-26T19:01:30.820 に答える