17 오류 처리 및 언어 확장
구현체는 관련 ECMAScript 언어 구문이 평가되는 시점에 대부분의 오류를 보고해야 합니다. 조기 오류는 오류를 포함하는 Script의 어떤 구문도 평가되기 전에 검출하고 보고할 수 있는 오류입니다. 조기 오류가 존재하면 해당 구문의 평가가 방지됩니다. 구현체는 ParseScript에서 해당 Script를 파싱하는 과정의 일부로 Script의 조기 오류를 보고해야 합니다. Module의 조기 오류는 Module이 평가될 시점에 보고되며 해당 Module은 절대로 초기화되지 않습니다. eval 코드의 조기 오류는 eval이 호출될 때 보고되며 eval 코드의 평가를 방지합니다. 조기 오류가 아닌 모든 오류는 런타임 오류입니다.
구현체는 이 명세의 “Static Semantics: 조기 오류” 하위 절에 나열된 조건이 발생하면 이를 조기 오류로 보고해야 합니다.
구현체는 컴파일러가 어떤 구문이 어떠한 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도 다른 종류의 오류를 조기 오류로 취급해서는 안 됩니다. 이러한 경우 구현체는 조기 경고를 낼 수 있지만 관련 구문이 실제로 실행될 때까지 오류를 보고해서는 안 됩니다.
구현체는 다음의 경우를 제외하고 명시된 대로 모든 오류를 보고해야 합니다:
-
17.1에서 제한하는 경우를 제외하고 호스트 또는 구현체는 Script 구문, Module 구문 및 정규 표현식 패턴 또는 플래그 구문을 확장할 수 있습니다. 이를 허용하기 위해 SyntaxError를 던질 수 있는 모든 연산(예:
eval 호출, 정규 표현식 리터럴 사용 또는 Function이나 RegExp 생성자 사용)은 스크립트 구문이나 정규 표현식 패턴 또는 플래그 구문에 대한 호스트 정의 확장을 발견했을 때 SyntaxError를 던지는 대신 호스트 정의 동작을 나타낼 수 있습니다.
-
17.1에서 제한하는 경우를 제외하고 호스트 또는 구현체는 이 명세에 설명된 것 외에 추가 타입, 값, 객체, 프로퍼티 및 함수를 제공할 수 있습니다. 이로 인해 구문(예: 전역 스코프에서 변수를 조회하는 경우)이 오류(예: ReferenceError)를 던지는 대신 호스트 정의 동작을 나타낼 수 있습니다.
17.1 금지된 확장
구현체는 다음과 같은 방식으로 이 명세를 확장해서는 안 됩니다:
-
엄격 모드 코드에서 구문적 생성자를 사용하여 정의된 ECMAScript 함수 객체에는 "caller" 또는 "arguments"라는 이름의 자체 프로퍼티를 생성해서는 안 됩니다. 또한 정의가 엄격 모드 코드 안에 포함되어 있는지 여부와 관계없이 ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration, AsyncFunctionExpression 또는 AsyncArrowFunction을 사용하여 정의된 함수 객체에도 이러한 자체 프로퍼티를 생성해서는 안 됩니다. 내장 함수, Function 생성자를 사용하여 생성된 엄격 함수, Generator 생성자를 사용하여 생성된 제너레이터 함수, AsyncFunction 생성자를 사용하여 생성된 비동기 함수 및
bind 메서드를 사용하여 생성된 함수에도 이러한 자체 프로퍼티를 생성해서는 안 됩니다.
-
구현체가 어떤 함수 객체에 "caller"라는 이름의 자체 프로퍼티를 추가하는 경우 [[Get]] 또는 [[GetOwnProperty]]을 사용하여 관찰되는 해당 프로퍼티의 값은 엄격 함수 객체여서는 안 됩니다. 접근자 프로퍼티인 경우 해당 프로퍼티의 [[Getter]] 속성 값인 함수는 호출될 때 엄격 함수를 절대로 반환해서는 안 됩니다.
-
매핑된 arguments 객체와 매핑되지 않은 arguments 객체 모두 "caller"라는 이름의 자체 프로퍼티를 갖도록 생성해서는 안 됩니다.
-
toLocaleString이라는 이름의 메서드처럼 ECMA-402에 명시된 내장 메서드의 동작은 ECMA-402에 명시된 경우를 제외하고 확장해서는 안 됩니다.
-
22.2.1 및 B.1.2의 RegExp 패턴 문법은 [UnicodeMode] 문법 매개변수가 존재할 때 소스 문자 A-Z 또는 a-z 중 어떤 것도 IdentityEscape[+UnicodeMode]로 인식하도록 확장해서는 안 됩니다.
-
구문 문법은 BindingIdentifier 비단말 기호와 일치하는 소스 텍스트 바로 뒤에 토큰
:가 올 수 있도록 어떤 방식으로도 확장해서는 안 됩니다.
-
엄격 모드 코드를 처리할 때 구현체는 12.9.3.1의 조기 오류 규칙을 완화해서는 안 됩니다.
-
TemplateEscapeSequence는 12.9.4에 정의된 LegacyOctalEscapeSequence 또는 NonOctalDecimalEscapeSequence를 포함하도록 확장해서는 안 됩니다.
-
엄격 모드 코드를 처리할 때 B.3.1, B.3.2, B.3.3 및 B.3.5에 정의된 확장을 지원해서는 안 됩니다.
-
Module 목표 기호를 사용하여 파싱할 때 B.1.1에 정의된 어휘 문법 확장을 지원해서는 안 됩니다.
-
ImportCall은 확장해서는 안 됩니다.