이와 같은 문제가 발생하는 이유는 콘솔 자체가 현재 대상으로하는 컨텍스트의 전체 범위를 모방하려고하기 때문입니다. 또한 콘솔에 작성한 명령문 및 표현식에서 리턴 값을 캡처하여 결과로 표시되도록 시도합니다. 예를 들어,
> 3 + 2
< 5
여기서는 표현식 인 것처럼 실행되지만 명령문 인 것처럼 작성했습니다. 일반 스크립트에서는 값이 삭제되지만 여기서는 전체 명령문을 함수 컨텍스트 및 명령문으로 랩핑하는 것과 같이 코드가 내부적으로 엉망이 return
되어 발생하는 문제를 포함하여 모든 종류의 이상한 효과가 발생합니다.
이는 스크립트의 일부 ES6 코드가 제대로 작동하지만 Chrome 개발자 도구 콘솔에서는 작동하지 않는 이유 중 하나입니다.
노드 및 Chrome 콘솔에서 이것을 실행하십시오.
{ let a = 3 }
노드 또는 <script>
태그에서는 정상적으로 작동하지만 콘솔에서는을 제공합니다 Uncaught SyntaxError: Unexpected identifier
. 또한 VMxxx:1
평가 된 소스를 검사하기 위해 클릭 할 수 있는 형식으로 소스에 대한 링크를 제공합니다 .
({ let a = 3 })
왜 이렇게 했습니까?
대답은 결과를 호출자에게 반환하고 콘솔에 표시 할 수 있도록 코드를 표현식으로 변환해야한다는 것입니다. 명령문을 괄호로 묶어 표현식을 작성할 수 있지만, 위의 블록은 구문 상 올바르지 않습니다 (표현식은 블록 선언을 가질 수 없음).
콘솔은 코드에 대해 똑똑하여 이러한 엣지 사례를 해결하려고 시도하지만이 답변의 범위를 벗어납니다. 버그를 수정하여 문제를 고칠 수 있는지 확인할 수 있습니다.
다음은 매우 유사한 좋은 예입니다.
https://stackoverflow.com/a/28431346/46588
코드를 작동시키는 가장 안전한 방법은 코드를 표현식으로 실행하고 SyntaxError
소스 링크를 검사 하여 실제 실행 코드가 무엇인지 확인하고 그로부터 솔루션을 리버스 엔지니어링하는 것입니다. 일반적으로 전략적으로 배치 된 괄호 쌍을 의미합니다.
간단히 말해 콘솔은 가능한 한 정확하게 글로벌 실행 컨텍스트를 에뮬레이션하려고하지만 v8 엔진 및 JavaScript 시맨틱과의 상호 작용 제한으로 인해 해결하기가 어렵거나 불가능한 경우가 있습니다.