115

JavaScript には、現在実行中のステートメントの行番号を決定するメカニズムがありますか (もしそうなら、それは何ですか)?

4

8 に答える 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 に答える
1

あなたが試すことができます:

window.onerror = handleError;
function handleError(err, url, line){
    alert(err + '\n on page: ' + url + '\n on line: ' + line);
}

次に、知りたい場所にエラーをスローします(過度に望ましくはありませんが、デバッグしている場合に役立つ可能性があります。

注:WebKitまたはOperawindow.onerrorでは定義/処理されません(最後にチェックしたとき)

于 2010-02-26T18:22:27.177 に答える