이와 같은 문제가 발생하는 이유는 콘솔 자체가 현재 대상으로하는 컨텍스트의 전체 범위를 모방하려고하기 때문입니다. 또한 콘솔에 작성한 명령문 및 표현식에서 리턴 값을 캡처하여 결과로 표시되도록 시도합니다. 예를 들어,
> 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 시맨틱과의 상호 작용 제한으로 인해 해결하기가 어렵거나 불가능한 경우가 있습니다.