JavaScript에는 현재 실행중인 문의 줄 번호를 결정하는 메커니즘이 있습니까 (그렇다면 무엇입니까)?
답변:
var thisline = new Error().lineNumber
사용중인 환경에서 작동하지 않는 경우 다음을 시도해 볼 수 있습니다.
var stack = new Error().stack
그런 다음 스택에서 줄 번호를 찾으십시오.
lineNumber
하지 않으며 속성이 오류 개체에 존재하지 않습니다. 어느 쪽도하지 않습니다 stack
:-)
다른 브라우저와 브라우저 버전간에 좀 더 이식성이 뛰어납니다 (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];
}
var frameRE = /:(\d+:\d+)[^\d]*$/;
특히 JS가 하나의 긴 줄로 축소 될 때 훨씬 더 유용합니다.
일부 마크를 찾기 위해 함수의 소스를 구문 분석 할 수 있습니다.
다음은 간단한 예입니다 (예, 약간 엉망입니다).
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;
}
throwAndResume(resumeFunction);
resumeFunction을 저장하고 오류를 발생 시키는 특수 함수 를 만들 수도 있으며 오류 처리기에 세부 정보를 기록한 다음 resumeFunction을 호출하여 프로그램을 계속할 수 있습니다.
Angular에서 줄 번호는 컴파일 된 코드의 줄 번호이기 때문에 순전히 Error.stack에서 줄 번호를 가져올 수 없습니다. 그러나 오류가 발생한 방법에 대한 정보를 얻을 수 있습니다. 이 코드 조각의 Logger 클래스는이 정보를 새 로그 북 항목에 추가합니다.
https://stackblitz.com/edit/angular-logger?file=src/app/Logger/logger.ts
코드가 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 줄 번호는 항상 일관되고 동일합니다.