헷갈리는 자바스크립트 파싱 퍼즐
원문은 Hillel Wayne님이 에 게재했습니다. 이 블로그 구독하기
이 코드는 무엇을 출력할까요?
x
= 1
x
--> 0
먼저 스스로 생각해 본 뒤, 브라우저 콘솔에서 직접 실행해 보세요! 정답과 해설은 드롭다운 안에 있습니다.
정답 보기
1이 출력됩니다.
잠깐, 뭐야 이게
줄의 맨 앞(그리고 오직 맨 앞에서만)에서 -->는 주석을 시작합니다. 자바스크립트는 다음과 같이 파싱됩니다.
x = 1;
x; // 0
그러면 브라우저는 마지막 표현식의 값을 표시하는데, 그 값은 당연히 1입니다.
그런데 왜?
과거의 잔재 같은 꼼수 때문입니다.
Netscape Navigator 2는 자바스크립트와 <script> 태그를 모두 처음 도입했습니다. 당시 널리 쓰이던 구형 브라우저(예: Navigator 1)는 <script> 안의 내용이 특별한 것이라는 걸 전혀 알지 못했고 페이지에 일반 텍스트처럼 그대로 출력했습니다. 원활한 하위 호환(graceful degradation)을 위해 웹 개발자들은 스크립트를 HTML 주석 블록으로 감쌌습니다.
<script>
<!--
console.log("hello world!")
-->
</script>구형 브라우저는 그 내용을 HTML 주석으로 파싱해 무시했고, 신형 브라우저는 그 내용을 자바스크립트로 파싱해 실행했습니다. 왜 <!--와 -->가 문법 오류가 아니었는지는 저도 정확히 모르겠습니다. 아마 JS 엔진에 이를 처리하는 특별한 코드가 있었겠지만, 어디에 있는지는 찾지 못했습니다.
모든 최신 브라우저는 최소한 <script>를 인식합니다.1 하지만 여전히 이 꼼수를 쓰는 오래된 웹사이트들이 남아 있고, 표준화 위원회는 절대, 절대로 웹을 망가뜨리지 않을 것이기 때문에, 위원회는 <!--와 -->를 정식 주석 토큰으로 2015년 표준에 추가했습니다.
<!--와-->는 모두//처럼 동작합니다. 즉, 줄 주석을 시작합니다.-->는 줄의 시작에서만 유효하고(후위 감소 연산자 뒤에 부등호가 오는 경우와의 모호성을 피하기 위해),<!--는 줄 어디에서나 올 수 있습니다. — MDN Web Docs
웹 브라우저는 이 구문을 지원해야 합니다만, 다른 엔진들은 그럴 필요가 없습니다. 다만 Node와 Electron은 Chromium의 V8 엔진을 공유하기 때문에 둘 다 이를 지원합니다.
- Lynx 같은 텍스트 전용 브라우저는 태그를 인식하지만, 내용을 무시할 뿐입니다. [return]
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기