JavaScript에서 현재 줄 번호를 어떻게 확인할 수 있습니까?


답변:


71

var thisline = new Error().lineNumber

사용중인 환경에서 작동하지 않는 경우 다음을 시도해 볼 수 있습니다.

var stack = new Error().stack

그런 다음 스택에서 줄 번호를 찾으십시오.


3
IE에서 작동 lineNumber하지 않으며 속성이 오류 개체에 존재하지 않습니다. 어느 쪽도하지 않습니다 stack:-)
앤디 E

1
IE 어딘가에 줄 번호가 있습니다. 내 자바 스크립트가 오류를 던질 때 1 억 이상의 숫자가있는 줄에 있다고 말하기 때문에 이것을 알고 있습니다.
Malfist

나는 그것이 1250이어야 할 때 그것의 1350 인 정확한 숫자를 얻지
못합니다

1
문제점 : PHP를 사용하는 경우 자바 스크립트에서 보이는 "소스 코드"는 원래 소스 코드가 아니므로 잘못된 줄 번호가 있습니다. (그것이 Hermann에게 일어나고있는 일일 것입니다.) 자바 스크립트를 만드는 방법을 알고있는 사람이 원래 PHP 소스 코드 줄 번호를 볼 수 있습니까? 이 솔루션은 아마도 일종의 "소스 맵"생성과 관련이있을 수 있지만 방법을 찾을 수 없습니다. 확실히 이건 해결 된 문제 죠 ??
Dave Burton

참고 : 경우에 따라 오류 개체가 생성 될 때 스택 / 줄 번호를 사용할 수없고, 예를 들어 Google Apps Script에서 발생하는 경우에만 사용할 수 있습니다. 경우 솔루션에 대한 이 답변 을 참조 하세요 .
user202729

39

당신이 사용할 수있는:

function test(){
    console.trace();
}

test();

1
지금까지 가장 간단한 솔루션이며 MS Edge에서도 작동합니다.
Danger

27

다른 브라우저와 브라우저 버전간에 좀 더 이식성이 뛰어납니다 (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];
}

감사. 귀하의 제안을 이에 맞게 수정했습니다. stackoverflow.com/a/37081135/470749
Ryan

1
정규식을 조정하면 줄 번호와 열 번호를 모두 반환 할 수 있습니다. var frameRE = /:(\d+:\d+)[^\d]*$/;특히 JS가 하나의 긴 줄로 축소 될 때 훨씬 더 유용합니다.
Quinn Comendant

경고, Chrome 용 ViolentMonkey 스크립트에서는 작동하지 않습니다. 가짜 번호가 표시되지만 이유는 알 수 없습니다.
hanshenrik

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;
}

3

코드에 다음 스 니펫을 삽입하십시오.

console.debug("line:", /\(file:[\w\d/.-]+:([\d]+)/.exec(new Error().stack)[1]);

필요에 따라 프로토콜 이름을
바꿉니다

1
나는 이것을 작동시킬 수 없었다. 나는 TypeError: /\(http:[\w\d/.-]+:([\d]+)/.exec(...) is null.
라이언

2

당신은 시도 할 수 있습니다:

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

그런 다음 알고 싶은 곳에 오류를 발생시킵니다 (과도하게 원하지는 않지만 디버깅하는 경우 도움이 될 수 있습니다.).

참고 : WebKit 또는 Operawindow.onerror 에서 정의 / 처리되지 않습니다 (마지막으로 확인했을 때).


1
window.onerror는 webkit에서 작동하지 않습니다 : bugs.webkit.org/show_bug.cgi?id=8519
Annie

1
흥미 롭군. throwAndResume(resumeFunction);resumeFunction을 저장하고 오류를 발생 시키는 특수 함수 를 만들 수도 있으며 오류 처리기에 세부 정보를 기록한 다음 resumeFunction을 호출하여 프로그램을 계속할 수 있습니다.
z5h


-2

코드가 JavaScript + PHP 인 경우 현재 PHP 줄 번호는 PHP에서 다음과 같이 사용할 수 있으므로 JavaScript에서 리터럴 상수로 사용할 수 있습니다.   <?= __LINE__ ?>

(당연히 PHP 짧은 태그가 활성화되어 있다고 가정합니다.)

예를 들어 JavaScript에서는 다음과 같이 말할 수 있습니다.

this_php_line_number = <?= __LINE__ ?>;

그러나주의하지 않으면 PHP 행 번호가 JavaScript 행 번호와 다를 수 있습니다. PHP는 브라우저가 소스 행을보기 전에 소스 행을 "먹기"때문입니다. 따라서 문제는 PHP와 JavaScript 줄 번호가 동일한 지 확인하는 것입니다. 서로 다르면 브라우저의 JavaScript 디버거를 사용하는 것이 훨씬 덜 즐겁습니다.

서버 측 (PHP) 및 브라우저 측 (JavaScript) 행 번호를 동기화하는 데 필요한 올바른 줄 바꿈 수를 작성하는 PHP 문을 포함하여 행 번호가 동일한 지 확인할 수 있습니다.

내 코드는 다음과 같습니다.

<!DOCTYPE html>
<html lang="en">
<!-- Copyright 2016, 2017, me and my web site -->
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="initial-scale=1, user-scalable=yes">

<?php

...lots of PHP stuff here, including all PHP function definitions ...

echo str_repeat("\n",__LINE__-6); # Synchronize PHP and JavaScript line numbers
?>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

  <title>My web page title</title>

...lots of HTML and JavaScript stuff here...

</body>
</html>
<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

핵심은 다음 PHP 문입니다.

echo str_repeat("\n",__LINE__-6);

그것은 자바 스크립트에서 보이는 줄 번호가 PHP 줄 번호와 같도록하기에 충분한 줄 바꿈을 뱉어냅니다. 모든 PHP 함수 정의 등은 그 라인보다 맨 위에 있습니다.

그 줄 이후에는 줄 번호를 변경하지 않는 코드로 PHP 사용을 제한합니다.

"-6"은 내 PHP 코드가 8 행에서 시작된다는 사실을 설명합니다. PHP 코드를 더 일찍 시작하면이 숫자를 줄일 수 있습니다. 어떤 사람들은 자신의 PHP를 DOCTYPE보다 훨씬 앞선 맨 위에 놓습니다.

(메타 뷰포트 라인은이 Stack Overflow Q & A에 따라 Android Chrome "글꼴 부스팅"을 비활성화합니다. Android의 Chrome은 글꼴 크기를 조정 합니다. 모든 웹 페이지에 필요한 상용구를 고려하세요.)

다음 줄은 내가 실수하지 않았는지 확인하기위한 것입니다. 브라우저의 디버거에서 보거나 오른쪽 클릭 / 웹 페이지 저장을 통해 올바른 소스 파일 이름과 줄 번호를 보여주는 HTML 주석이됩니다.

<!-- *** this is line <?php echo __LINE__ . ' of ' . basename(__FILE__); ?> *** -->

된다 :

<!-- *** this is line 1234 of my_file.php *** -->

이제 오류 메시지에 있든 JavaScript 디버거에 있든 상관없이 줄 번호를 볼 때마다 정확합니다. PHP 줄 번호와 JavaScript 줄 번호는 항상 일관되고 동일합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.