9 실행 가능한 코드와 실행 컨텍스트

9.1 Environment Record

Environment Record는 ECMAScript 코드의 어휘적 중첩 구조를 바탕으로 Identifier를 특정 변수 및 함수와 연관시키는 것을 정의하는 데 사용되는 명세 타입이다. 보통 Environment Record는 FunctionDeclaration, BlockStatement, 또는 TryStatementCatch 절과 같은 ECMAScript 코드의 특정 구문 구조와 연관된다. 이러한 코드가 평가될 때마다, 해당 코드에 의해 생성되는 식별자 바인딩을 기록하기 위해 새로운 Environment Record가 생성된다.

모든 Environment Record는 [[OuterEnv]] 필드를 가지며, 그 값은 null 또는 바깥쪽 Environment Record에 대한 참조이다. 이것은 Environment Record 값들의 논리적 중첩을 모델링하는 데 사용된다. 어떤 (안쪽) Environment Record의 outer reference는 그 안쪽 Environment Record를 논리적으로 둘러싸는 Environment Record에 대한 참조이다. 바깥쪽 Environment Record는 물론 자기 자신의 바깥쪽 Environment Record를 가질 수 있다. 하나의 Environment Record는 여러 안쪽 Environment Record의 outer environment 역할을 할 수 있다. 예를 들어, FunctionDeclaration이 두 개의 중첩된 FunctionDeclaration을 포함한다면, 각 중첩 함수의 Environment Record는 둘러싸고 있는 함수의 현재 평가에 대한 Environment Record를 자신의 outer Environment Record로 가진다.

Environment Record는 순전히 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다. ECMAScript 프로그램이 이러한 값에 직접 접근하거나 조작하는 것은 불가능하다.

9.1.1 Environment Record 타입 계층

Environment Record는 단순한 객체지향 계층에 존재하는 것으로 생각할 수 있으며, 여기서 Environment Record는 추상 클래스이고 세 개의 구체적 서브클래스인 Declarative Environment Record, Object Environment Record, Global Environment Record를 가진다. Function Environment RecordModule Environment RecordDeclarative Environment Record의 서브클래스이다.

  • Environment Record (추상)

    • Declarative Environment RecordFunctionDeclaration, VariableDeclaration, Catch 절과 같이 식별자 바인딩을 ECMAScript 언어 값에 직접 연관시키는 ECMAScript 언어 구문 요소의 효과를 정의하는 데 사용된다.

      • Function Environment Record는 ECMAScript 함수 객체의 호출에 대응하며, 그 함수 내부의 최상위 선언에 대한 바인딩을 포함한다. 이는 새로운 this 바인딩을 설정할 수 있다. 또한 super 메서드 호출을 지원하는 데 필요한 상태도 포착한다.

      • Module Environment RecordModule의 최상위 선언에 대한 바인딩을 포함한다. 또한 Module에 의해 명시적으로 import된 바인딩도 포함한다. 그 [[OuterEnv]]Global Environment Record이다.

    • Object Environment RecordWithStatement와 같이 식별자 바인딩을 어떤 객체의 프로퍼티와 연관시키는 ECMAScript 요소의 효과를 정의하는 데 사용된다.

    • Global Environment RecordScript의 전역 선언에 사용된다. 이것은 바깥 환경을 가지지 않으며, 그 [[OuterEnv]]null이다. 식별자 바인딩으로 미리 채워질 수 있으며, 그 프로퍼티가 전역 환경의 일부 식별자 바인딩을 제공하는 연관된 전역 객체를 포함한다. ECMAScript 코드가 실행됨에 따라 추가 프로퍼티가 전역 객체에 추가될 수 있고 초기 프로퍼티가 수정될 수 있다.

Environment Record 추상 클래스는 Table 14에 정의된 추상 명세 메서드를 포함한다. 이 추상 메서드들은 각 구체적 서브클래스에 대해 서로 다른 구체 알고리즘을 가진다.

Table 14: Abstract Methods of Environment Records
메서드 목적 정의
HasBinding ( name )

The abstract method HasBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

이것은 Environment Recordname에 대한 바인딩을 가지는지 결정한다.
이것은 다음 타입들에 구체 정의를 가진다:
CreateMutableBinding ( name, deletable )

The abstract method CreateMutableBinding takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion.

이것은 Environment Record 안에 초기화되지 않은 새로운 가변 바인딩을 생성한다. name은 바인딩된 이름의 텍스트이다. deletabletrue이면 그 바인딩은 이후 삭제될 수 있다.
이것은 다음 타입들에 구체 정의를 가진다:
CreateImmutableBinding ( name, strict )

The abstract method CreateImmutableBinding takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

이것은 Environment Record 안에 초기화되지 않은 새로운 불변 바인딩을 생성한다. name은 바인딩된 이름의 텍스트이다. stricttrue이면, 그것이 초기화된 후 값을 설정하려는 시도는 그 바인딩을 참조하는 연산의 strict mode 설정과 관계없이 항상 예외를 던진다.
이것은 다음 타입들에 구체 정의를 가진다:
InitializeBinding ( name, value )

The abstract method InitializeBinding takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion.

이것은 Environment Record 안에 이미 존재하지만 아직 초기화되지 않은 바인딩의 값을 설정한다. name은 바인딩된 이름의 텍스트이다. value는 그 바인딩에 대한 값이다.
이것은 다음 타입들에 구체 정의를 가진다:
SetMutableBinding ( name, value, strict )

The abstract method SetMutableBinding takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion.

이것은 Environment Record 안에 이미 존재하는 가변 바인딩의 값을 설정한다. name은 바인딩된 이름의 텍스트이다. value는 그 바인딩에 대한 값이다. stricttrue이고 바인딩을 설정할 수 없으면, 이것은 TypeError 예외를 던진다.
이것은 다음 타입들에 구체 정의를 가진다:
GetBindingValue ( name, strict )

The abstract method GetBindingValue takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion.

이것은 Environment Record에서 이미 존재하는 바인딩의 값을 반환한다. name은 바인딩된 이름의 텍스트이다. strictstrict mode 코드에서 유래한 참조이거나 그 밖에 strict mode 참조 의미론을 요구하는 참조를 식별하는 데 사용된다. stricttrue이고 바인딩이 존재하지 않으면, 이것은 ReferenceError 예외를 던진다. 바인딩이 존재하지만 초기화되지 않았다면, strict의 값과 관계없이 ReferenceError가 던져진다.
이것은 다음 타입들에 구체 정의를 가진다:
DeleteBinding ( name )

The abstract method DeleteBinding takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion.

이것은 Environment Record에서 바인딩을 삭제한다. name은 바인딩된 이름의 텍스트이다. name에 대한 바인딩이 존재하면, 이것은 그 바인딩을 제거하고 true를 반환한다. 바인딩이 존재하지만 제거할 수 없으면, 이것은 false를 반환한다. 바인딩이 존재하지 않으면, 이것은 true를 반환한다.
이것은 다음 타입들에 구체 정의를 가진다:
HasThisBinding ( )

The abstract method HasThisBinding takes no arguments and returns a Boolean.

이것은 Environment Recordthis 바인딩을 설정하는지 결정한다. 설정한다면 true를, 그렇지 않다면 false를 반환한다.
이것은 다음 타입들에 구체 정의를 가진다:
GetThisBinding ( )

The abstract method GetThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion.

이것은 이 Environment Recordthis 바인딩 값을 반환한다. this 바인딩이 초기화되지 않았다면 ReferenceError를 던진다.
이것은 다음 타입들에 구체 정의를 가진다:
HasSuperBinding ( )

The abstract method HasSuperBinding takes no arguments and returns a Boolean.

이것은 Environment Recordsuper 메서드 바인딩을 설정하는지 결정한다. 설정한다면 true를, 그렇지 않다면 false를 반환한다. 이것이 true를 반환하면, 그 Environment RecordFunction Environment Record임을 뜻하지만, 그 역은 성립하지 않는다.
이것은 다음 타입들에 구체 정의를 가진다:
WithBaseObject ( )

The abstract method WithBaseObject takes no arguments and returns an Object or undefined.

Environment Recordwith 문과 연관되어 있으면, with 객체를 반환한다. 그렇지 않으면 undefined를 반환한다.
이것은 다음 타입들에 구체 정의를 가진다:

9.1.1.1 Declarative Environment Record

Declarative Environment Record는 변수, 상수, let, class, module, import 및/또는 함수 선언을 포함하는 ECMAScript 프로그램 스코프와 연관된다. Declarative Environment Record는 그 스코프 안에 포함된 선언들이 정의하는 식별자 집합을 바인딩한다.

9.1.1.1.1 HasBinding ( name )

The HasBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. 이것은 인수 식별자가 record에 의해 바인딩된 식별자들 중 하나인지 결정한다. It performs the following steps when called:

  1. envRecname에 대한 바인딩을 가지면, true를 반환한다.
  2. false를 반환한다.

9.1.1.1.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns a normal completion containing unused. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 가변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. deletabletrue이면, 새 바인딩은 삭제 가능 대상으로 표시된다. It performs the following steps when called:

  1. Assert: envRecname에 대한 바인딩을 이미 가지고 있지 않다.
  2. envRec 안에 name에 대한 가변 바인딩을 생성하고, 그것이 초기화되지 않았음을 기록한다. deletabletrue이면, 새로 생성된 바인딩이 이후 DeleteBinding 호출에 의해 삭제될 수 있음을 기록한다.
  3. unused를 반환한다.

9.1.1.1.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns a normal completion containing unused. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 불변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. stricttrue이면, 새 바인딩은 strict 바인딩으로 표시된다. It performs the following steps when called:

  1. Assert: envRecname에 대한 바인딩을 이미 가지고 있지 않다.
  2. envRec 안에 name에 대한 불변 바인딩을 생성하고, 그것이 초기화되지 않았음을 기록한다. stricttrue이면, 새로 생성된 바인딩이 strict 바인딩임을 기록한다.
  3. unused를 반환한다.

9.1.1.1.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns a normal completion containing unused. 이것은 이름이 name인 식별자의 현재 바인딩 값으로 value를 설정하는 데 사용된다. name에 대한 초기화되지 않은 바인딩이 이미 존재해야 한다. It performs the following steps when called:

  1. Assert: envRecname에 대한 초기화되지 않은 바인딩을 가지고 있어야 한다.
  2. envRec 안에서 name에 대한 바인딩 값을 value로 설정한다.
  3. envRec 안의 name에 대한 바인딩이 초기화되었음을 기록한다.
  4. unused를 반환한다.

9.1.1.1.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Declarative Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 바꾸려 시도한다. 보통 name에 대한 바인딩은 이미 존재하지만, 드물게는 존재하지 않을 수도 있다. 바인딩이 불변 바인딩이면, stricttrue일 때 TypeError가 던져진다. It performs the following steps when called:

  1. envRecname에 대한 바인딩을 가지고 있지 않다면,
    1. stricttrue이면, ReferenceError 예외를 던진다.
    2. envRec.CreateMutableBinding(name, true)를 수행한다.
    3. envRec.InitializeBinding(name, value)를 수행한다.
    4. unused를 반환한다.
  2. envRec 안의 name에 대한 바인딩이 strict 바인딩이면, stricttrue로 설정한다.
  3. envRec 안의 name에 대한 바인딩이 아직 초기화되지 않았다면,
    1. ReferenceError 예외를 던진다.
  4. 그렇지 않고 envRec 안의 name에 대한 바인딩이 가변 바인딩이면,
    1. 그 바인딩 값을 value로 바꾼다.
  5. 그렇지 않으면,
    1. Assert: 이것은 불변 바인딩의 값을 바꾸려는 시도이다.
    2. stricttrue이면, TypeError 예외를 던진다.
  6. unused를 반환한다.
Note

단계 1에서 바인딩이 없는 경우를 초래하는 ECMAScript 코드의 예는 다음과 같다:

function f() { eval("var x; x = (delete x, 0);"); }

9.1.1.1.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Declarative Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 바인딩이 존재하지만 초기화되지 않았다면, strict의 값과 관계없이 ReferenceError가 던져진다. It performs the following steps when called:

  1. Assert: envRecname에 대한 바인딩을 가지고 있다.
  2. envRec 안의 name에 대한 바인딩이 초기화되지 않은 바인딩이면, ReferenceError 예외를 던진다.
  3. envRec 안에서 현재 name에 바인딩된 값을 반환한다.

9.1.1.1.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Declarative Environment Record envRec takes argument name (a String) and returns a normal completion containing a Boolean. 이것은 명시적으로 삭제 가능 대상으로 지정된 바인딩만 삭제할 수 있다. It performs the following steps when called:

  1. Assert: envRecname에 대한 바인딩을 가지고 있다.
  2. envRec 안의 name에 대한 바인딩을 삭제할 수 없으면, false를 반환한다.
  3. envRec에서 name에 대한 바인딩을 제거한다.
  4. true를 반환한다.

9.1.1.1.8 HasThisBinding ( )

The HasThisBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false를 반환한다.
Note

일반적인 Declarative Environment Record(즉, Function Environment RecordModule Environment Record도 아닌 것)는 this 바인딩을 제공하지 않는다.

9.1.1.1.9 GetThisBinding ( )

Declarative Environment RecordGetThisBinding 구체 메서드는 이 명세에서 결코 사용되지 않는다.

9.1.1.1.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Declarative Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false를 반환한다.
Note

일반적인 Declarative Environment Record(즉, Function Environment RecordModule Environment Record도 아닌 것)는 super 바인딩을 제공하지 않는다.

9.1.1.1.11 WithBaseObject ( )

The WithBaseObject concrete method of a Declarative Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined를 반환한다.

9.1.1.2 Object Environment Record

Object Environment Record는 자신의 binding object라고 불리는 객체와 연관된다. Object Environment Record는 자신의 binding object의 프로퍼티 이름과 직접 대응하는 문자열 식별자 이름들의 집합을 바인딩한다. IdentifierName 형태의 문자열이 아닌 프로퍼티 키는 바인딩된 식별자 집합에 포함되지 않는다. own 프로퍼티와 상속된 프로퍼티는 [[Enumerable]] 속성의 설정과 관계없이 모두 집합에 포함된다. 객체에는 프로퍼티가 동적으로 추가되거나 삭제될 수 있으므로, Object Environment Record에 의해 바인딩되는 식별자 집합은 프로퍼티를 추가하거나 삭제하는 어떤 연산의 부작용으로 잠재적으로 변할 수 있다. 그러한 부작용의 결과로 생성되는 모든 바인딩은, 대응하는 프로퍼티의 Writable 속성이 false이더라도, 가변 바인딩으로 간주된다. 불변 바인딩은 Object Environment Record에는 존재하지 않는다.

with 문(14.11)을 위해 생성된 Object Environment Record는 함수 호출에 사용될 암묵적 this 값으로 자신의 binding object를 제공할 수 있다. 이 기능은 Boolean [[IsWithEnvironment]] 필드로 제어된다.

Object Environment Record는 Table 15에 나열된 추가 상태 필드를 가진다.

Table 15: Additional Fields of Object Environment Records
필드 이름 의미
[[BindingObject]] an Object Environment Record의 binding object.
[[IsWithEnvironment]] a Boolean Environment Recordwith 문을 위해 생성되었는지를 나타낸다.

9.1.1.2.1 HasBinding ( name )

The HasBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 연관된 binding object가 이름이 name인 프로퍼티를 가지는지 결정한다. It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]]라고 하자.
  2. foundBinding을 ? HasProperty(bindingObject, name)이라고 하자.
  3. foundBindingfalse이면, false를 반환한다.
  4. envRec.[[IsWithEnvironment]]false이면, true를 반환한다.
  5. unscopables를 ? Get(bindingObject, %Symbol.unscopables%)라고 하자.
  6. unscopables가 Object이면,
    1. blockedToBoolean(? Get(unscopables, name))라고 하자.
    2. blockedtrue이면, false를 반환한다.
  7. true를 반환한다.

9.1.1.2.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 Environment Record와 연관된 binding object에 이름이 name인 프로퍼티를 만들고 그 값을 undefined로 초기화한다. deletabletrue이면 새 프로퍼티의 [[Configurable]] 속성은 true로 설정되고, 그렇지 않으면 false로 설정된다. It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]]라고 하자.
  2. DefinePropertyOrThrow(bindingObject, name, PropertyDescriptor { [[Value]]: undefined, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable })를 수행한다.
  3. unused를 반환한다.
Note

보통 envRecname에 대한 바인딩을 가지고 있지 않지만, 만약 가지고 있다면 DefinePropertyOrThrow의 의미론에 따라 기존 바인딩이 교체되거나 가려질 수 있으며, 또는 abrupt completion이 반환될 수 있다.

9.1.1.2.3 CreateImmutableBinding ( name, strict )

Object Environment RecordCreateImmutableBinding 구체 메서드는 이 명세에서 결코 사용되지 않는다.

9.1.1.2.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of an Object Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 설정하는 데 사용된다. It performs the following steps when called:

  1. envRec.SetMutableBinding(name, value, false)를 수행한다.
  2. unused를 반환한다.
Note

이 명세에서 Object Environment Record에 대한 CreateMutableBinding의 모든 사용은 같은 이름에 대한 InitializeBinding 호출이 즉시 뒤따른다. 따라서 이 명세는 Object Environment Record 안의 바인딩 초기화 상태를 명시적으로 추적하지 않는다.

9.1.1.2.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of an Object Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 Environment Record와 연관된 binding object에서 이름이 name인 프로퍼티의 값을 value로 설정하려 시도한다. 이름이 name인 프로퍼티는 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]]라고 하자.
  2. stillExists를 ? HasProperty(bindingObject, name)라고 하자.
  3. stillExistsfalse이고 stricttrue이면, ReferenceError 예외를 던진다.
  4. Set(bindingObject, name, value, strict)를 수행한다.
  5. unused를 반환한다.

9.1.1.2.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of an Object Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 연관된 binding object에서 이름이 name인 프로퍼티의 값을 반환한다. 그 프로퍼티는 보통 이미 존재해야 하지만, 존재하지 않는 경우 결과는 strict에 따라 달라진다. It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]]라고 하자.
  2. value를 ? HasProperty(bindingObject, name)라고 하자.
  3. valuefalse이면,
    1. strictfalse이면, undefined를 반환한다.
    2. ReferenceError 예외를 던진다.
  4. Get(bindingObject, name)를 반환한다.

9.1.1.2.7 DeleteBinding ( name )

The DeleteBinding concrete method of an Object Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 환경 객체의 [[Configurable]] 속성이 true인 프로퍼티에 대응하는 바인딩만 삭제할 수 있다. It performs the following steps when called:

  1. bindingObjectenvRec.[[BindingObject]]라고 하자.
  2. bindingObject.[[Delete]](name)를 반환한다.

9.1.1.2.8 HasThisBinding ( )

The HasThisBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false를 반환한다.
Note

Object Environment Recordthis 바인딩을 제공하지 않는다.

9.1.1.2.9 GetThisBinding ( )

Object Environment RecordGetThisBinding 구체 메서드는 이 명세에서 결코 사용되지 않는다.

9.1.1.2.10 HasSuperBinding ( )

The HasSuperBinding concrete method of an Object Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false를 반환한다.
Note

Object Environment Recordsuper 바인딩을 제공하지 않는다.

9.1.1.2.11 WithBaseObject ( )

The WithBaseObject concrete method of an Object Environment Record envRec takes no arguments and returns an Object or undefined. It performs the following steps when called:

  1. envRec.[[IsWithEnvironment]]true이면, envRec.[[BindingObject]]를 반환한다.
  2. undefined를 반환한다.

9.1.1.3 Function Environment Record

Function Environment Record는 함수의 최상위 스코프를 나타내는 데 사용되는 Declarative Environment Record이며, 함수가 ArrowFunction이 아니면 this 바인딩을 제공한다. 함수가 ArrowFunction 함수가 아니고 super를 참조하면, 그 Function Environment Record는 함수 내부에서 super 메서드 호출을 수행하는 데 사용되는 상태도 포함한다.

Function Environment Record는 Table 16에 나열된 추가 상태 필드를 가진다.

Table 16: Additional Fields of Function Environment Records
필드 이름 의미
[[ThisValue]] an ECMAScript language value 이것은 이 함수 호출에 사용되는 this 값이다.
[[ThisBindingStatus]] lexical, initialized, or uninitialized 값이 lexical이면, 이것은 ArrowFunction이며 로컬 this 값을 가지지 않는다.
[[FunctionObject]] an ECMAScript function object Environment Record가 생성되게 한 함수 객체 호출의 함수 객체.
[[NewTarget]] a constructor or undefined Environment Record[[Construct]] 내부 메서드에 의해 생성되었다면, [[NewTarget]][[Construct]]newTarget 매개변수 값이다. 그렇지 않으면 그 값은 undefined이다.

Function Environment Record는 Table 14에 나열된 모든 Declarative Environment Record 메서드를 지원하며, HasThisBinding, GetThisBinding, HasSuperBinding을 제외한 모든 메서드에 대해 같은 명세를 공유한다.

9.1.1.3.1 BindThisValue ( envRec, value )

The abstract operation BindThisValue takes arguments envRec (a Function Environment Record) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 envRec.[[ThisValue]]를 설정하고 그것이 초기화되었음을 기록한다. It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]]lexical이 아니다.
  2. envRec.[[ThisBindingStatus]]initialized이면, ReferenceError 예외를 던진다.
  3. envRec.[[ThisValue]]value로 설정한다.
  4. envRec.[[ThisBindingStatus]]initialized로 설정한다.
  5. unused를 반환한다.

9.1.1.3.2 HasThisBinding ( )

The HasThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical이면, false를 반환한다.
  2. true를 반환한다.

9.1.1.3.3 GetThisBinding ( )

The GetThisBinding concrete method of a Function Environment Record envRec takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. It performs the following steps when called:

  1. Assert: envRec.[[ThisBindingStatus]]lexical이 아니다.
  2. envRec.[[ThisBindingStatus]]uninitialized이면, ReferenceError 예외를 던진다.
  3. envRec.[[ThisValue]]를 반환한다.

9.1.1.3.4 HasSuperBinding ( )

The HasSuperBinding concrete method of a Function Environment Record envRec takes no arguments and returns a Boolean. It performs the following steps when called:

  1. envRec.[[ThisBindingStatus]]lexical이면, false를 반환한다.
  2. envRec.[[FunctionObject]].[[HomeObject]]undefined이면, false를 반환한다.
  3. true를 반환한다.

9.1.1.3.5 GetSuperBase ( envRec )

The abstract operation GetSuperBase takes argument envRec (a Function Environment Record) and returns an Object, null, or undefined. 이것은 envRec 안에 바인딩된 super 프로퍼티 접근의 기반 객체를 반환한다. 값 undefined는 그러한 접근이 런타임 오류를 발생시킬 것임을 나타낸다. It performs the following steps when called:

  1. homeenvRec.[[FunctionObject]].[[HomeObject]]라고 하자.
  2. homeundefined이면, undefined를 반환한다.
  3. Assert: homeordinary object이다.
  4. home.[[GetPrototypeOf]]()를 반환한다.

9.1.1.4 Global Environment Record

Global Environment Record는 공통 realm에서 처리되는 모든 ECMAScript Script 요소가 공유하는 가장 바깥쪽 스코프를 나타내는 데 사용된다. Global Environment Record는 내장 전역(clause 19), 전역 객체의 프로퍼티, 그리고 Script 내부에 나타나는 모든 최상위 선언(8.2.9, 8.2.11)에 대한 바인딩을 제공한다.

Global Environment Record는 논리적으로는 단일 record이지만, Object Environment RecordDeclarative Environment Record를 캡슐화하는 합성체로 명세된다. Object Environment Record는 연관된 Realm Record전역 객체를 자신의 base object로 가진다. 이 전역 객체는 Global Environment Record의 GetThisBinding 구체 메서드가 반환하는 값이다. Global Environment Record의 Object Environment Record 구성요소는 모든 내장 전역(clause 19)과, 전역 코드 안에 포함된 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableStatement에 의해 도입되는 모든 바인딩을 포함한다. 전역 코드 안의 다른 모든 ECMAScript 선언에 대한 바인딩은 Global Environment Record의 Declarative Environment Record 구성요소에 포함된다.

프로퍼티는 전역 객체 위에 직접 생성될 수 있다. 따라서 Global Environment Record의 Object Environment Record 구성요소는 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 선언에 의해 명시적으로 생성된 바인딩과 전역 객체의 프로퍼티로 암묵적으로 생성된 바인딩을 모두 포함할 수 있다.

Global Environment Record는 Table 17에 나열된 추가 필드를 가진다.

Table 17: Additional Fields of Global Environment Records
필드 이름 의미
[[ObjectRecord]] an Object Environment Record Binding object는 전역 객체이다. 이것은 전역 내장 바인딩뿐 아니라 연관된 realm에 대한 전역 코드 안의 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 바인딩도 포함한다.
[[GlobalThisValue]] an Object 전역 스코프에서 this가 반환하는 값. 호스트는 어떤 ECMAScript Object 값이든 제공할 수 있다.
[[DeclarativeRecord]] a Declarative Environment Record 연관된 realm 코드에 대한 전역 코드 안의 모든 선언 중 FunctionDeclaration, GeneratorDeclaration, AsyncFunctionDeclaration, AsyncGeneratorDeclaration, VariableDeclaration 바인딩을 제외한 모든 선언의 바인딩을 포함한다.

9.1.1.4.1 HasBinding ( name )

The HasBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 인수 식별자가 record에 의해 바인딩된 식별자들 중 하나인지 결정한다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면, true를 반환한다.
  3. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  4. objectRecord.HasBinding(name)를 반환한다.

9.1.1.4.2 CreateMutableBinding ( name, deletable )

The CreateMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 가변 바인딩을 생성한다. 그 바인딩은 연관된 DeclarativeRecord 안에 생성된다. DeclarativeRecord 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. deletabletrue이면, 새 바인딩은 삭제 가능 대상으로 표시된다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면, TypeError 예외를 던진다.
  3. declarativeRecord.CreateMutableBinding(name, deletable)를 반환한다.

9.1.1.4.3 CreateImmutableBinding ( name, strict )

The CreateImmutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 name이라는 이름에 대해 초기화되지 않은 새로운 불변 바인딩을 생성한다. 이 Environment Record 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. stricttrue이면, 새 바인딩은 strict 바인딩으로 표시된다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면, TypeError 예외를 던진다.
  3. declarativeRecord.CreateImmutableBinding(name, strict)를 반환한다.

9.1.1.4.4 InitializeBinding ( name, value )

The InitializeBinding concrete method of a Global Environment Record envRec takes arguments name (a String) and value (an ECMAScript language value) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 설정하는 데 사용된다. name에 대한 초기화되지 않은 바인딩이 이미 존재해야 한다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면,
    1. declarativeRecord.InitializeBinding(name, value)를 반환한다.
  3. Assert: 바인딩이 존재한다면, 그것은 반드시 Object Environment Record 안에 있어야 한다.
  4. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  5. objectRecord.InitializeBinding(name, value)를 반환한다.

9.1.1.4.5 SetMutableBinding ( name, value, strict )

The SetMutableBinding concrete method of a Global Environment Record envRec takes arguments name (a String), value (an ECMAScript language value), and strict (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 이름이 name인 식별자의 현재 바인딩 값을 value로 바꾸려 시도한다. 바인딩이 불변 바인딩이고 stricttrue이면, TypeError가 던져진다. 이름이 name인 바인딩은 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면,
    1. declarativeRecord.SetMutableBinding(name, value, strict)를 반환한다.
  3. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  4. objectRecord.SetMutableBinding(name, value, strict)를 반환한다.

9.1.1.4.6 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Global Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 바인딩이 초기화되지 않은 바인딩이면, ReferenceError 예외를 던진다. 이름이 name인 바인딩은 보통 이미 존재하지만, 존재하지 않거나 현재 writable하지 않은 경우 오류 처리는 strict에 의해 결정된다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면,
    1. declarativeRecord.GetBindingValue(name, strict)를 반환한다.
  3. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  4. objectRecord.GetBindingValue(name, strict)를 반환한다.

9.1.1.4.7 DeleteBinding ( name )

The DeleteBinding concrete method of a Global Environment Record envRec takes argument name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 명시적으로 삭제 가능 대상으로 지정된 바인딩만 삭제할 수 있다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)이 true이면,
    1. declarativeRecord.DeleteBinding(name)를 반환한다.
  3. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  4. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  5. existingProp를 ? HasOwnProperty(globalObject, name)라고 하자.
  6. existingProptrue이면,
    1. objectRecord.DeleteBinding(name)를 반환한다.
  7. true를 반환한다.

9.1.1.4.8 HasThisBinding ( )

The HasThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true를 반환한다.
Note

Global Environment Record는 항상 this 바인딩을 제공한다.

9.1.1.4.9 GetThisBinding ( )

The GetThisBinding concrete method of a Global Environment Record envRec takes no arguments and returns a normal completion containing an Object. It performs the following steps when called:

  1. envRec.[[GlobalThisValue]]를 반환한다.

9.1.1.4.10 HasSuperBinding ( )

The HasSuperBinding concrete method of a Global Environment Record envRec takes no arguments and returns false. It performs the following steps when called:

  1. false를 반환한다.
Note

Global Environment Recordsuper 바인딩을 제공하지 않는다.

9.1.1.4.11 WithBaseObject ( )

The WithBaseObject concrete method of a Global Environment Record envRec takes no arguments and returns undefined. It performs the following steps when called:

  1. undefined를 반환한다.

9.1.1.4.12 HasLexicalDeclaration ( envRec, name )

The abstract operation HasLexicalDeclaration takes arguments envRec (a Global Environment Record) and name (a String) and returns a Boolean. 이것은 인수 식별자가 LexicalDeclaration이나 ClassDeclaration과 같은 lexical declaration을 사용해 envRec 안에 생성된 바인딩을 가지는지 결정한다. It performs the following steps when called:

  1. declarativeRecordenvRec.[[DeclarativeRecord]]라고 하자.
  2. declarativeRecord.HasBinding(name)를 반환한다.

9.1.1.4.13 HasRestrictedGlobalProperty ( envRec, name )

The abstract operation HasRestrictedGlobalProperty takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 인수 식별자가 전역 lexical 바인딩에 의해 가려져서는 안 되는 전역 객체의 프로퍼티 이름인지 결정한다. It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  2. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](name)라고 하자.
  4. existingPropundefined이면, false를 반환한다.
  5. existingProp.[[Configurable]]true이면, false를 반환한다.
  6. true를 반환한다.
Note

전역 객체에는 var 또는 함수 선언을 사용해 선언된 것이 아니라 직접 생성된 프로퍼티가 존재할 수 있다. 전역 lexical 바인딩은 전역 객체의 non-configurable 프로퍼티와 같은 이름으로 생성될 수 없다. 전역 프로퍼티 "undefined"는 그러한 프로퍼티의 예이다.

9.1.1.4.14 CanDeclareGlobalVar ( envRec, name )

The abstract operation CanDeclareGlobalVar takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 동일한 인수 name에 대해 대응하는 CreateGlobalVarBinding 호출이 수행된다면 성공할지를 결정한다. 중복 var 선언과 기존 전역 객체 프로퍼티에 대한 var 선언은 허용된다. It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  2. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  3. hasProperty를 ? HasOwnProperty(globalObject, name)라고 하자.
  4. hasPropertytrue이면, true를 반환한다.
  5. IsExtensible(globalObject)를 반환한다.

9.1.1.4.15 CanDeclareGlobalFunction ( envRec, name )

The abstract operation CanDeclareGlobalFunction takes arguments envRec (a Global Environment Record) and name (a String) and returns either a normal completion containing a Boolean or a throw completion. 이것은 동일한 인수 name에 대해 대응하는 CreateGlobalFunctionBinding 호출이 수행된다면 성공할지를 결정한다. It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  2. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](name)라고 하자.
  4. existingPropundefined이면, ? IsExtensible(globalObject)를 반환한다.
  5. existingProp.[[Configurable]]true이면, true를 반환한다.
  6. IsDataDescriptor(existingProp)가 true이고 existingProp가 { [[Writable]]: true, [[Enumerable]]: true }라는 속성 값을 가지면, true를 반환한다.
  7. false를 반환한다.

9.1.1.4.16 CreateGlobalVarBinding ( envRec, name, deletable )

The abstract operation CreateGlobalVarBinding takes arguments envRec (a Global Environment Record), name (a String), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 연관된 Object Environment Record 안에 가변 바인딩을 생성하고 초기화한다. 바인딩이 이미 존재하면, 그것을 재사용하며 이미 초기화된 것으로 간주한다. It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  2. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  3. hasProperty를 ? HasOwnProperty(globalObject, name)라고 하자.
  4. extensible을 ? IsExtensible(globalObject)라고 하자.
  5. hasPropertyfalse이고 extensibletrue이면,
    1. objectRecord.CreateMutableBinding(name, deletable)를 수행한다.
    2. objectRecord.InitializeBinding(name, undefined)를 수행한다.
  6. unused를 반환한다.

9.1.1.4.17 CreateGlobalFunctionBinding ( envRec, name, value, deletable )

The abstract operation CreateGlobalFunctionBinding takes arguments envRec (a Global Environment Record), name (a String), value (an ECMAScript function object), and deletable (a Boolean) and returns either a normal completion containing unused or a throw completion. 이것은 연관된 Object Environment Record 안에 가변 바인딩을 생성하고 초기화한다. 바인딩이 이미 존재하면, 그것을 교체한다. It performs the following steps when called:

  1. objectRecordenvRec.[[ObjectRecord]]라고 하자.
  2. globalObjectobjectRecord.[[BindingObject]]라고 하자.
  3. existingProp를 ? globalObject.[[GetOwnProperty]](name)라고 하자.
  4. existingPropundefined이거나 existingProp.[[Configurable]]true이면,
    1. desc를 PropertyDescriptor { [[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: deletable }라고 하자.
  5. 그렇지 않으면,
    1. desc를 PropertyDescriptor { [[Value]]: value }라고 하자.
  6. DefinePropertyOrThrow(globalObject, name, desc)를 수행한다.
  7. Set(globalObject, name, value, false)를 수행한다.
  8. unused를 반환한다.
Note

전역 함수 선언은 항상 전역 객체의 own 프로퍼티로 표현된다. 가능하다면 기존 own 프로퍼티는 표준 속성 값 집합을 가지도록 재구성된다. 단계 7InitializeBinding 구체 메서드를 호출했을 때 하는 일과 동등하며, globalObject가 Proxy라면 같은 순서의 Proxy trap 호출을 발생시킨다.

9.1.1.5 Module Environment Record

Module Environment Record는 ECMAScript Module의 바깥 스코프를 나타내는 데 사용되는 Declarative Environment Record이다. 일반적인 가변 및 불변 바인딩에 더해, Module Environment Record는 불변 import 바인딩도 제공하는데, 이것은 다른 Environment Record에 존재하는 대상 바인딩에 대한 간접 접근을 제공하는 바인딩이다.

Module Environment Record는 Table 14에 나열된 모든 Declarative Environment Record 메서드를 지원하며, GetBindingValue, DeleteBinding, HasThisBinding, GetThisBinding을 제외한 모든 메서드에 대해 같은 명세를 공유한다.

9.1.1.5.1 GetBindingValue ( name, strict )

The GetBindingValue concrete method of a Module Environment Record envRec takes arguments name (a String) and strict (a Boolean) and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 이름이 name인 바인딩된 식별자의 값을 반환한다. 그러나 바인딩이 간접 바인딩이면, 대상 바인딩의 값을 반환한다. 바인딩이 존재하지만 초기화되지 않았다면 ReferenceError가 던져진다. It performs the following steps when called:

  1. Assert: stricttrue이다.
  2. Assert: envRecname에 대한 바인딩을 가지고 있다.
  3. name에 대한 바인딩이 간접 바인딩이면,
    1. moduletargetName을 이 name에 대한 바인딩이 생성될 때 제공된 간접 참조 값이라고 하자.
    2. targetEnvmodule.[[Environment]]라고 하자.
    3. targetEnvempty이면, ReferenceError 예외를 던진다.
    4. targetEnv.GetBindingValue(targetName, true)를 반환한다.
  4. envRec 안의 name에 대한 바인딩이 초기화되지 않은 바인딩이면, ReferenceError 예외를 던진다.
  5. envRec 안에서 현재 name에 바인딩된 값을 반환한다.
Note

Module은 항상 strict mode 코드이기 때문에 strict은 항상 true이다.

9.1.1.5.2 DeleteBinding ( name )

Module Environment RecordDeleteBinding 구체 메서드는 이 명세에서 결코 사용되지 않는다.

Note

Module Environment Record는 오직 strict 코드 안에서만 사용되며, early error 규칙은 strict 코드에서 delete 연산자가 Module Environment Record 바인딩으로 해석될 Reference Record에 적용되는 것을 방지한다. 13.5.1.1를 보라.

9.1.1.5.3 HasThisBinding ( )

The HasThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns true. It performs the following steps when called:

  1. true를 반환한다.
Note

Module Environment Record는 항상 this 바인딩을 제공한다.

9.1.1.5.4 GetThisBinding ( )

The GetThisBinding concrete method of a Module Environment Record envRec takes no arguments and returns a normal completion containing undefined. It performs the following steps when called:

  1. undefined를 반환한다.

9.1.1.5.5 CreateImportBinding ( envRec, name, targetModule, targetName )

The abstract operation CreateImportBinding takes arguments envRec (a Module Environment Record), name (a String), targetModule (a Module Record), and targetName (a String) and returns unused. 이것은 이름 name에 대해 초기화된 새로운 불변 간접 바인딩을 생성한다. envRec 안에는 name에 대한 바인딩이 이미 존재해서는 안 된다. targetNametargetModuleModule Environment Record 안에 존재하는 바인딩의 이름이다. 새 바인딩 값에 대한 접근은 대상 바인딩의 바인딩된 값에 간접적으로 접근하게 된다. It performs the following steps when called:

  1. Assert: envRecname에 대한 바인딩을 이미 가지고 있지 않다.
  2. Assert: targetModule.[[Environment]]가 instantiate될 때, 그것은 targetName에 대한 직접 바인딩을 가질 것이다.
  3. envRec 안에 name에 대한 불변 간접 바인딩을 생성하고, 그 대상 바인딩으로 targetModuletargetName을 참조하도록 한 뒤, 그 바인딩이 초기화되었음을 기록한다.
  4. unused를 반환한다.

9.1.2 Environment Record 연산

다음 추상 연산들은 이 명세에서 Environment Record를 조작하는 데 사용된다:

9.1.2.1 GetIdentifierReference ( env, name, strict )

The abstract operation GetIdentifierReference takes arguments env (an Environment Record or null), name (a String), and strict (a Boolean) and returns either a normal completion containing a Reference Record or a throw completion. It performs the following steps when called:

  1. envnull이면,
    1. Reference Record { [[Base]]: unresolvable, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.
  2. exists를 ? env.HasBinding(name)라고 하자.
  3. existstrue이면,
    1. Reference Record { [[Base]]: env, [[ReferencedName]]: name, [[Strict]]: strict, [[ThisValue]]: empty }를 반환한다.
  4. outerenv.[[OuterEnv]]라고 하자.
  5. GetIdentifierReference(outer, name, strict)를 반환한다.

9.1.2.2 NewDeclarativeEnvironment ( outerEnv )

The abstract operation NewDeclarativeEnvironment takes argument outerEnv (an Environment Record or null) and returns a Declarative Environment Record. It performs the following steps when called:

  1. 아무 바인딩도 포함하지 않는 새로운 Declarative Environment Recordenv라고 하자.
  2. env.[[OuterEnv]]outerEnv로 설정한다.
  3. env를 반환한다.

9.1.2.3 NewObjectEnvironment ( obj, isWithEnvironment, outerEnv )

The abstract operation NewObjectEnvironment takes arguments obj (an Object), isWithEnvironment (a Boolean), and outerEnv (an Environment Record or null) and returns an Object Environment Record. It performs the following steps when called:

  1. 새로운 Object Environment Recordenv라고 하자.
  2. env.[[BindingObject]]obj로 설정한다.
  3. env.[[IsWithEnvironment]]isWithEnvironment로 설정한다.
  4. env.[[OuterEnv]]outerEnv로 설정한다.
  5. env를 반환한다.

9.1.2.4 NewFunctionEnvironment ( func, newTarget )

The abstract operation NewFunctionEnvironment takes arguments func (an ECMAScript function object) and newTarget (an Object or undefined) and returns a Function Environment Record. It performs the following steps when called:

  1. 아무 바인딩도 포함하지 않는 새로운 Function Environment Recordenv라고 하자.
  2. env.[[FunctionObject]]func로 설정한다.
  3. func.[[ThisMode]]lexical이면, env.[[ThisBindingStatus]]lexical로 설정한다.
  4. 그렇지 않으면, env.[[ThisBindingStatus]]uninitialized로 설정한다.
  5. env.[[NewTarget]]newTarget으로 설정한다.
  6. env.[[OuterEnv]]func.[[Environment]]로 설정한다.
  7. env를 반환한다.

9.1.2.5 NewGlobalEnvironment ( obj, thisValue )

The abstract operation NewGlobalEnvironment takes arguments obj (an Object) and thisValue (an Object) and returns a Global Environment Record. It performs the following steps when called:

  1. objRecNewObjectEnvironment(obj, false, null)라고 하자.
  2. dclRecNewDeclarativeEnvironment(null)라고 하자.
  3. 새로운 Global Environment Recordenv라고 하자.
  4. env.[[ObjectRecord]]objRec로 설정한다.
  5. env.[[GlobalThisValue]]thisValue로 설정한다.
  6. env.[[DeclarativeRecord]]dclRec로 설정한다.
  7. env.[[OuterEnv]]null로 설정한다.
  8. env를 반환한다.

9.1.2.6 NewModuleEnvironment ( outerEnv )

The abstract operation NewModuleEnvironment takes argument outerEnv (a Global Environment Record) and returns a Module Environment Record. It performs the following steps when called:

  1. 아무 바인딩도 포함하지 않는 새로운 Module Environment Recordenv라고 하자.
  2. env.[[OuterEnv]]outerEnv로 설정한다.
  3. env를 반환한다.

9.2 PrivateEnvironment Record

PrivateEnvironment Record는 ECMAScript 코드 안의 ClassDeclarationClassExpression의 어휘적 중첩 구조를 바탕으로 Private Name을 추적하는 데 사용되는 명세 메커니즘이다. 이것들은 Environment Record와 유사하지만, 서로 구별된다. 각 PrivateEnvironment RecordClassDeclaration 또는 ClassExpression과 연관된다. 그러한 클래스가 평가될 때마다, 그 클래스에 의해 선언된 Private Name을 기록하기 위해 새로운 PrivateEnvironment Record가 생성된다.

PrivateEnvironment RecordTable 18에 정의된 필드를 가진다.

Table 18: PrivateEnvironment Record Fields
필드 이름 값 타입 의미
[[OuterPrivateEnvironment]] a PrivateEnvironment Record or null 가장 가까운 바깥 클래스의 PrivateEnvironment Record. 이 PrivateEnvironment Record와 연관된 클래스가 다른 어떤 클래스 안에도 포함되어 있지 않다면 null이다.
[[Names]] a List of Private Names 이 클래스에 의해 선언된 Private Name.

9.2.1 PrivateEnvironment Record 연산

다음 추상 연산들은 이 명세에서 PrivateEnvironment Record를 조작하는 데 사용된다:

9.2.1.1 NewPrivateEnvironment ( outerPrivateEnv )

The abstract operation NewPrivateEnvironment takes argument outerPrivateEnv (a PrivateEnvironment Record or null) and returns a PrivateEnvironment Record. It performs the following steps when called:

  1. names를 새로운 빈 List라고 하자.
  2. PrivateEnvironment Record { [[OuterPrivateEnvironment]]: outerPrivateEnv, [[Names]]: names }를 반환한다.

9.2.1.2 ResolvePrivateIdentifier ( privateEnv, identifier )

The abstract operation ResolvePrivateIdentifier takes arguments privateEnv (a PrivateEnvironment Record) and identifier (a String) and returns a Private Name. It performs the following steps when called:

  1. namesprivateEnv.[[Names]]라고 하자.
  2. names의 각 Private Name pn에 대해, 다음을 수행한다.
    1. pn.[[Description]]identifier이면,
      1. pn을 반환한다.
  3. outerPrivateEnvprivateEnv.[[OuterPrivateEnvironment]]라고 하자.
  4. Assert: outerPrivateEnvnull이 아니다.
  5. ResolvePrivateIdentifier(outerPrivateEnv, identifier)를 반환한다.

9.3 Realm

평가되기 전에, 모든 ECMAScript 코드는 반드시 realm과 연관되어야 한다. 개념적으로 realm은 intrinsic object들의 집합, ECMAScript 전역 환경, 그 전역 환경의 범위 안에서 로드된 모든 ECMAScript 코드, 그리고 다른 연관된 상태 및 자원으로 구성된다.

realm은 이 명세에서 Table 19에 명시된 필드를 가진 Realm Record로 표현된다:

Table 19: Realm Record Fields
필드 이름 의미
[[AgentSignifier]] an agent signifier realm을 소유하는 agent
[[Intrinsics]] 필드 이름이 intrinsic key이고 값이 객체인 Record realm과 연관된 코드가 사용하는 intrinsic 값
[[GlobalObject]] an Object realm전역 객체
[[GlobalEnv]] a Global Environment Record realm의 전역 환경
[[TemplateMap]] [[Site]] (a TemplateLiteral Parse Node)와 [[Array]] (an Array) 필드를 가진 Record들의 List

템플릿 객체는 각 realmRealm Record[[TemplateMap]]을 사용해 별도로 canonicalize된다. 각 [[Site]] 값은 TemplateLiteral인 Parse Node이다. 연관된 [[Array]] 값은 tag 함수에 전달되는 대응 템플릿 객체이다.

Note 1
어떤 Parse Node가 도달 불가능해지면, 대응하는 [[Array]]도 역시 도달 불가능해지며, 구현이 그 쌍을 [[TemplateMap]] 리스트에서 제거하더라도 관찰 불가능하다.
[[LoadedModules]] LoadedModuleRequest Record들의 List

realm이 import한 specifier 문자열에서 해석된 Module Record로의 맵. 이 리스트는 ModuleRequestsEqual(r1, r2)가 true인 서로 다른 두 Record r1r2를 포함하지 않는다.

Note 2
HostLoadImportedModule에서 언급했듯이 (16.2.1.10 Note 1), Realm Record[[LoadedModules]]는 활성 script나 module이 없는 문맥에서 import() 표현식을 실행할 때에만 사용된다.
[[HostDefined]] anything (기본값은 undefined) Realm Record와 추가 정보를 연관시켜야 하는 호스트를 위해 예약된 필드.

9.3.1 InitializeHostDefinedRealm ( )

The abstract operation InitializeHostDefinedRealm takes no arguments and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. 새로운 Realm Recordrealm이라고 하자.
  2. CreateIntrinsics(realm)를 수행한다.
  3. realm.[[AgentSignifier]]AgentSignifier()로 설정한다.
  4. realm.[[TemplateMap]]를 새로운 빈 List로 설정한다.
  5. 새로운 execution contextnewContext라고 하자.
  6. newContext의 Function을 null로 설정한다.
  7. newContextRealmrealm으로 설정한다.
  8. newContext의 ScriptOrModule을 null로 설정한다.
  9. newContextexecution context stack에 push한다; 이제 newContextrunning execution context이다.
  10. 호스트realm전역 객체로 사용될 특정 객체를 요구하면,
    1. global호스트 정의 방식으로 생성된 그러한 객체라고 하자.
  11. 그렇지 않으면,
    1. globalOrdinaryObjectCreate(realm.[[Intrinsics]].[[%Object.prototype%]])라고 하자.
  12. 호스트realm의 전역 스코프에서 this 바인딩이 전역 객체가 아닌 다른 객체를 반환하도록 요구하면,
    1. thisValue호스트 정의 방식으로 생성된 그러한 객체라고 하자.
  13. 그렇지 않으면,
    1. thisValueglobal이라고 하자.
  14. realm.[[GlobalObject]]global로 설정한다.
  15. realm.[[GlobalEnv]]NewGlobalEnvironment(global, thisValue)로 설정한다.
  16. SetDefaultGlobalBindings(realm)를 수행한다.
  17. global호스트 정의 전역 객체 프로퍼티를 생성한다.
  18. unused를 반환한다.

9.3.2 CreateIntrinsics ( realmRec )

The abstract operation CreateIntrinsics takes argument realmRec (a Realm Record) and returns unused. It performs the following steps when called:

  1. realmRec.[[Intrinsics]]를 새로운 Record로 설정한다.
  2. Table 6에 나열된 값으로 realmRec.[[Intrinsics]]의 필드를 설정한다. 필드 이름은 표의 “Intrinsic Name” 열에 나열된 이름들이다. 각 필드의 값은 19부터 28까지의 절에서 각 객체의 명세에 따라 완전하고 재귀적으로 프로퍼티 값이 채워진 새로운 객체 값이다. 모든 객체 프로퍼티 값은 새로 생성된 객체 값이다. 내장 함수 객체인 모든 값은, steps가 이 명세에 제공된 그 함수의 정의이고, name이 함수의 "name" 프로퍼티의 초기값이며, length가 함수의 "length" 프로퍼티의 초기값이고, slots가 함수의 명시된 internal slot 이름들의 리스트(있다면)이며, prototype이 함수의 [[Prototype]] internal slot의 명시된 값이고, async가 함수가 “async”로 설명되는 경우 true 아니면 false일 때, CreateBuiltinFunction(steps, length, name, slots, realmRec, prototype, async)를 수행함으로써 생성된다. intrinsic 및 그 프로퍼티의 생성은 아직 생성되지 않은 객체에 대한 의존성을 피할 수 있도록 순서가 정해져야 한다.
  3. AddRestrictedFunctionProperties(realmRec.[[Intrinsics]].[[%Function.prototype%]], realmRec)를 수행한다.
  4. unused를 반환한다.

9.3.3 SetDefaultGlobalBindings ( realmRec )

The abstract operation SetDefaultGlobalBindings takes argument realmRec (a Realm Record) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. globalrealmRec.[[GlobalObject]]라고 하자.
  2. 19에 명시된 Global Object의 각 프로퍼티에 대해, 다음을 수행한다.
    1. name을 프로퍼티 이름의 String 값이라고 하자.
    2. desc를 그 프로퍼티에 대해 명시된 속성을 포함하는, 완전히 채워진 데이터 Property Descriptor라고 하자. 19.2, 19.3, 또는 19.4에 나열된 프로퍼티들에 대해서는 [[Value]] 속성의 값이 realmRec의 대응 intrinsic object이다.
    3. DefinePropertyOrThrow(global, name, desc)를 수행한다.
  3. unused를 반환한다.

9.4 Execution Context

execution context는 ECMAScript 구현에 의한 코드의 런타임 평가를 추적하는 데 사용되는 명세 장치이다. 어떤 시점에도 실제로 코드를 실행 중인 execution context는 agent당 최대 하나뿐이다. 이것을 그 agent의 running execution context라고 한다. 이 명세에서 running execution context에 대한 모든 참조는 주변 agent의 running execution context를 의미한다.

execution context stack은 execution context를 추적하는 데 사용된다. running execution context는 항상 이 스택의 최상단 요소이다. 현재 running execution context와 연관된 실행 가능한 코드에서 그 execution context와 연관되지 않은 실행 가능한 코드로 제어가 이전될 때마다 새로운 execution context가 생성된다. 새로 생성된 execution context는 스택에 push되고 running execution context가 된다.

execution context는 연관된 코드의 실행 진행을 추적하는 데 필요한 구현 특화 상태를 포함한다. 각 execution context는 최소한 Table 20에 나열된 상태 구성요소를 가진다.

Table 20: State Components for All Execution Contexts
구성요소 목적
코드 평가 상태 execution context와 연관된 코드의 평가를 수행, 중단, 재개하는 데 필요한 모든 상태.
Function execution context가 함수 객체의 코드를 평가 중이라면, 이 구성요소의 값은 그 함수 객체이다. context가 Script 또는 Module의 코드를 평가 중이라면, 값은 null이다.
Realm 연관된 코드가 ECMAScript 자원에 접근하는 Realm Record.
ScriptOrModule 연관된 코드의 기원이 되는 Module Record 또는 Script Record. InitializeHostDefinedRealm에서 생성되는 최초 execution context의 경우처럼 원래의 script나 module이 없다면, 값은 null이다.

running execution context에 의한 코드 평가는 이 명세 안에 정의된 여러 지점에서 중단될 수 있다. running execution context가 한 번 중단되면, 다른 execution context가 running execution context가 되어 자신의 코드를 평가하기 시작할 수 있다. 이후 어느 시점에 중단된 execution context가 다시 running execution context가 되어, 이전에 중단되었던 지점부터 자신의 코드 평가를 계속할 수 있다. execution context들 사이에서 running execution context 상태의 전이는 보통 스택과 같은 후입선출 방식으로 일어난다. 그러나 일부 ECMAScript 기능은 running execution context의 비-LIFO 전이를 요구한다.

running execution contextRealm 구성요소 값은 current Realm Record라고도 한다. running execution context의 Function 구성요소 값은 active function object라고도 한다.

ECMAScript 코드 실행 컨텍스트Table 21에 나열된 추가 상태 구성 요소를 가진다.

Table 21: Additional State Components for ECMAScript Code Execution Contexts
구성요소 목적
LexicalEnvironment execution context 안의 코드가 만드는 식별자 참조를 해석하는 데 사용되는 Environment Record를 식별한다.
VariableEnvironment execution context 안의 VariableStatement에 의해 생성된 바인딩을 보유하는 Environment Record를 식별한다.
PrivateEnvironment 가장 가까운 바깥 클래스의 ClassElement에 의해 생성된 Private Name을 보유하는 PrivateEnvironment Record를 식별한다. 바깥 클래스가 없으면 null이다.

execution context의 LexicalEnvironment와 VariableEnvironment 구성요소는 항상 Environment Record이다.

Generator 평가를 나타내는 execution context는 Table 22에 나열된 추가 상태 구성요소를 가진다.

Table 22: Additional State Components for Generator Execution Contexts
구성요소 목적
Generator execution context가 평가하고 있는 Generator.

대부분의 상황에서는 오직 running execution context(즉 execution context stack의 최상단)만이 이 명세의 알고리즘에 의해 직접 조작된다. 따라서 “LexicalEnvironment”, “VariableEnvironment”라는 용어가 한정 없이 사용될 때는 running execution context의 해당 구성요소를 가리킨다.

execution context는 순전히 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다. ECMAScript 코드가 execution context에 직접 접근하거나 관찰하는 것은 불가능하다.

9.4.1 GetActiveScriptOrModule ( )

The abstract operation GetActiveScriptOrModule takes no arguments and returns a Script Record, a Module Record, or null. 이것은 running execution context를 바탕으로 현재 실행 중인 script 또는 module을 결정하는 데 사용된다. It performs the following steps when called:

  1. execution context stack이 비어 있으면, null을 반환한다.
  2. ecexecution context stack에서 ScriptOrModule 구성요소가 null이 아닌 최상단 execution context라고 하자.
  3. 그러한 execution context가 존재하지 않으면, null을 반환한다.
  4. ec의 ScriptOrModule을 반환한다.

9.4.2 ResolveBinding ( name [ , env ] )

The abstract operation ResolveBinding takes argument name (a String) and optional argument env (an Environment Record or undefined) and returns either a normal completion containing a Reference Record or a throw completion. 이것은 name의 바인딩을 결정하는 데 사용된다. env는 바인딩을 검색할 Environment Record를 명시적으로 제공하는 데 사용될 수 있다. It performs the following steps when called:

  1. env가 주어지지 않았거나 envundefined이면,
    1. envrunning execution context의 LexicalEnvironment로 설정한다.
  2. Assert: envEnvironment Record이다.
  3. strict을 평가 중인 구문 production의 IsStrict라고 하자.
  4. GetIdentifierReference(env, name, strict)를 반환한다.
Note

ResolveBinding의 결과는 항상 [[ReferencedName]] 필드가 nameReference Record이다.

9.4.3 GetThisEnvironment ( )

The abstract operation GetThisEnvironment takes no arguments and returns an Environment Record. 이것은 현재 키워드 this의 바인딩을 제공하는 Environment Record를 찾는다. It performs the following steps when called:

  1. envrunning execution context의 LexicalEnvironment라고 하자.
  2. 다음을 반복한다.
    1. existsenv.HasThisBinding()이라고 하자.
    2. existstrue이면, env를 반환한다.
    3. outerenv.[[OuterEnv]]라고 하자.
    4. Assert: outernull이 아니다.
    5. envouter로 설정한다.
Note

단계 2의 반복은 항상 종료된다. 왜냐하면 환경 리스트는 언제나 this 바인딩을 가지는 전역 환경에서 끝나기 때문이다.

9.4.4 ResolveThisBinding ( )

The abstract operation ResolveThisBinding takes no arguments and returns either a normal completion containing an ECMAScript language value or a throw completion. 이것은 running execution context의 LexicalEnvironment를 사용해 키워드 this의 바인딩을 결정한다. It performs the following steps when called:

  1. envRecGetThisEnvironment()라고 하자.
  2. envRec.GetThisBinding()을 반환한다.

9.4.5 GetNewTarget ( )

The abstract operation GetNewTarget takes no arguments and returns an Object or undefined. 이것은 running execution context의 LexicalEnvironment를 사용해 NewTarget 값을 결정한다. It performs the following steps when called:

  1. envRecGetThisEnvironment()라고 하자.
  2. Assert: envRec[[NewTarget]] 필드를 가진다.
  3. envRec.[[NewTarget]]를 반환한다.

9.4.6 GetGlobalObject ( )

The abstract operation GetGlobalObject takes no arguments and returns an Object. 이것은 현재 running execution context가 사용하는 전역 객체를 반환한다. It performs the following steps when called:

  1. currentRealmcurrent Realm Record라고 하자.
  2. currentRealm.[[GlobalObject]]를 반환한다.

9.4.7 RunSuspendedContext ( context, completionRecord )

The abstract operation RunSuspendedContext takes arguments context (an execution context) and completionRecord (a Completion Record) and returns either a normal completion containing either an ECMAScript language value or unused, or an abrupt completion. 이는 context를 재개하고(completionRecord를 재개 값으로 전송), 그 결과를 기다린다. It performs the following steps when called:

  1. callerContext를 실행 중인 실행 컨텍스트라 하자.
  2. callerContext를 일시 중단한다.
  3. context를 실행 컨텍스트 스택에 푸시한다. 이제 context가 실행 중인 실행 컨텍스트이다.
  4. context의 일시 중단된 평가를 재개한다. 이때 completionRecord를 그것을 일시 중단한 연산의 결과로 사용한다. 재개된 계산이 반환한 Completion Recordresult라 하자.
  5. Assert: 이 단계에 도달했을 때, context는 이미 실행 컨텍스트 스택에서 제거되었고 callerContext가 다시 실행 중인 실행 컨텍스트이다.
  6. Completion(result)를 반환한다.

9.5 Job과 Job을 enqueue하기 위한 호스트 연산

Job은 매개변수가 없는 Abstract Closure이며, 현재 다른 ECMAScript 계산이 진행 중이 아닐 때 ECMAScript 계산을 시작한다.

Job은 ECMAScript 호스트 환경에 의해 특정 agent에서 실행되도록 스케줄된다. 이 명세는 Job을 스케줄하기 위해 HostEnqueueGenericJob, HostEnqueueFinalizationRegistryCleanupJob, HostEnqueuePromiseJob, HostEnqueueTimeoutJob이라는 호스트 훅을 설명한다. 이 명세의 호스트 훅Job 스케줄링에 부과되는 추가 제약에 따라 조직되어 있다. 호스트Job을 스케줄하는 추가 추상 연산을 정의할 수 있다. 이러한 연산은 Job Abstract Closurerealm(Realm Record 또는 null)을 매개변수로 받는다. Realm Record가 제공되면, 이 연산은 제공된 realm 안에서, 그 realm을 소유한 agent 안에서, 미래의 어느 시점에 job이 수행되도록 스케줄한다. 대신 realmnull이 제공되면, 그 job은 ECMAScript 코드를 평가하지 않는다. 이들의 구현은 다음 요구 사항을 준수해야 한다:

  • 미래의 어느 시점에, job이 스케줄된 agent에 running context가 없고 그 agent의 execution context stack이 비어 있을 때, 구현은 반드시:
    1. 호스트 정의 준비 단계를 수행해야 한다.
    2. Job Abstract Closure호출해야 한다.
    3. 호스트 정의 정리 단계를 수행해야 하며, 그 후 execution context stack은 반드시 비어 있어야 한다.
  • 한 agent 안에서 어느 시점에도 평가가 활발히 진행 중인 Job은 오직 하나뿐이어야 한다.
  • Job의 평가가 시작되면, 그 agent 안에서 다른 Job의 평가가 시작되기 전에 반드시 완료까지 실행되어야 한다.
  • Abstract Closure는 정상 완료를 반환해야 하며, 오류 처리는 자체적으로 구현해야 한다.
Note 1
호스트 환경은 스케줄링과 관련해 Job을 균일하게 취급할 필요가 없다. 예를 들어, 웹 브라우저와 Node.js는 Promise 처리 Job을 다른 작업보다 더 높은 우선순위로 취급한다; 미래의 기능은 이렇게 높은 우선순위로 취급되지 않는 Job을 추가할 수 있다.

어떤 특정 시점에, scriptOrModule(Script Record, Module Record, 또는 null)은 다음 조건이 모두 참이면 active script or module이다:

어떤 특정 시점에, 다음 조건이 모두 참이면 하나의 execution은 ECMAScript 코드를 평가할 준비가 되어 있다:

Note 2

호스트 환경execution contextexecution context stack에 push함으로써 execution이 코드를 평가할 준비가 되게 만들 수 있다. 구체적인 단계는 구현 정의이다.

Realm의 구체적인 선택은 호스트 환경에 달려 있다. 이 초기 execution contextRealm은 어떤 callback 함수도 호출되기 전까지만 사용된다. Promise handler처럼 Job과 관련된 callback 함수가 호출되면, 그 호출은 자신의 execution contextRealm을 push한다.

특정 종류의 Job에는 추가 적합성 요구 사항이 있다.

9.5.1 JobCallback Record

JobCallback Record는 함수 객체와 호스트 정의 값을 저장하는 데 사용되는 Record 값이다. 호스트에 의해 enqueue된 Job을 통해 호출되는 함수 객체는 추가적인 호스트 정의 문맥을 가질 수 있다. 이 상태를 전파하기 위해, Job Abstract Closure는 함수 객체를 직접 캡처해서 호출해서는 안 된다. 대신 HostMakeJobCallbackHostCallJobCallback을 사용한다.

Note

예를 들어 WHATWG HTML 명세 (https://html.spec.whatwg.org/)는 Promise callback에 대한 incumbent settings object를 전파하기 위해 호스트 정의 값을 사용한다.

JobCallback Record는 Table 23에 나열된 필드를 가진다.

Table 23: JobCallback Record Fields
필드 이름 의미
[[Callback]] a function object Job이 호출될 때 호출할 함수.
[[HostDefined]] anything (기본값은 empty) 호스트용으로 예약된 필드.

9.5.2 HostMakeJobCallback ( callback )

The host-defined abstract operation HostMakeJobCallback takes argument callback (a function object) and returns a JobCallback Record.

HostMakeJobCallback의 구현은 다음 요구 사항을 준수해야 한다:

HostMakeJobCallback의 기본 구현은 호출되었을 때 다음 단계를 수행한다:

  1. JobCallback Record { [[Callback]]: callback, [[HostDefined]]: empty }를 반환한다.

웹 브라우저가 아닌 ECMAScript 호스트는 HostMakeJobCallback의 기본 구현을 사용해야 한다.

Note

이것은 callback이 결국 스케줄되고 실행되도록 책임지는 함수에 전달되는 시점에 호출된다. 예를 들어, promise.then(thenAction)은 reaction Job이 스케줄되는 시점이 아니라 Promise.prototype.then 호출 시점에 thenAction에 대해 MakeJobCallback을 호출한다.

9.5.3 HostCallJobCallback ( jobCallback, value, argumentsList )

The host-defined abstract operation HostCallJobCallback takes arguments jobCallback (a JobCallback Record), value (an ECMAScript language value), and argumentsList (a List of ECMAScript language values) and returns either a normal completion containing an ECMAScript language value or a throw completion.

HostCallJobCallback의 구현은 다음 요구 사항을 준수해야 한다:

  • 반드시 Call(jobCallback.[[Callback]], value, argumentsList)를 수행하고 그 결과를 반환해야 한다.
Note

이 요구 사항은 호스트가 이 명세에 정의된 함수 객체의 [[Call]] 동작을 변경할 수 없음을 의미한다.

HostCallJobCallback의 기본 구현은 호출되었을 때 다음 단계를 수행한다:

  1. Assert: IsCallable(jobCallback.[[Callback]])는 true이다.
  2. Call(jobCallback.[[Callback]], value, argumentsList)를 반환한다.

웹 브라우저가 아닌 ECMAScript 호스트는 HostCallJobCallback의 기본 구현을 사용해야 한다.

9.5.4 HostEnqueueGenericJob ( job, realm )

The host-defined abstract operation HostEnqueueGenericJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record) and returns unused. 이것은 realm.[[AgentSignifier]]로 표시되는 agent 안의 realm realm에서 job이 미래의 어느 시점에 수행되도록 스케줄한다. 이 알고리즘과 함께 사용되는 Abstract Closure는 우선순위나 순서 같은 추가 제약 없이 스케줄되도록 의도된다.

HostEnqueueGenericJob의 구현은 9.5의 요구 사항을 준수해야 한다.

9.5.5 HostEnqueuePromiseJob ( job, realm )

The host-defined abstract operation HostEnqueuePromiseJob takes arguments job (a Job Abstract Closure) and realm (a Realm Record or null) and returns unused. 이것은 job이 미래의 어느 시점에 수행되도록 스케줄한다. 이 알고리즘과 함께 사용되는 Abstract Closure는 Promise 처리와 관련되거나, 또는 Promise 처리 연산과 동등한 우선순위로 스케줄되도록 의도된다.

HostEnqueuePromiseJob의 구현은 9.5의 요구 사항뿐 아니라 다음도 준수해야 한다:

  • realmnull이 아니면, job이 호출될 때마다 구현은 job 호출 시점에 execution이 ECMAScript 코드를 평가할 준비가 되어 있도록 구현 정의 단계를 수행해야 한다.
  • HostEnqueuePromiseJob이 호출되는 시점의 GetActiveScriptOrModule()을 scriptOrModule이라 하자. realmnull이 아니면, job이 호출될 때마다 구현은 job 호출 시점에 scriptOrModule이 active script 또는 module이 되도록 구현 정의 단계를 수행해야 한다.
  • Job은 그것들을 스케줄한 HostEnqueuePromiseJob 호출과 같은 순서로 실행되어야 한다.
Note

NewPromiseResolveThenableJob이 반환하는 Job에 대한 realm은 보통 then 함수 객체에 대해 GetFunctionRealm을 호출한 결과이다. NewPromiseReactionJob이 반환하는 Job에 대한 realm은 handler가 undefined가 아닐 경우 보통 handler에 대해 GetFunctionRealm을 호출한 결과이다. handler가 undefined이면, realmnull이다. 두 종류의 Job 모두에서, GetFunctionRealm이 비정상 완료하는 경우(즉 취소된 Proxy에 대해 호출된 경우), realmGetFunctionRealm 호출 시점의 current Realm Record이다. realmnull일 때는 사용자 ECMAScript 코드는 평가되지 않으며 새로운 ECMAScript 객체(예: Error 객체)도 생성되지 않는다. 예를 들어 WHATWG HTML 명세 (https://html.spec.whatwg.org/)는 스크립트를 실행할 수 있는지 여부와 entry 개념을 확인하기 위해 realm을 사용한다.

9.5.6 HostEnqueueTimeoutJob ( timeoutJob, realm, milliseconds )

The host-defined abstract operation HostEnqueueTimeoutJob takes arguments timeoutJob (a Job Abstract Closure), realm (a Realm Record), and milliseconds (a non-negative finite Number) and returns unused. 이것은 realm.[[AgentSignifier]]로 표시되는 agent 안의 realm realm에서 timeoutJob이 적어도 milliseconds 밀리초 이후에 수행되도록 스케줄한다.

HostEnqueueTimeoutJob의 구현은 9.5의 요구 사항을 준수해야 한다.

9.6 에이전트

에이전트는 ECMAScript 실행 컨텍스트들의 집합, 실행 컨텍스트 스택, 실행 중인 실행 컨텍스트, 에이전트 레코드, 그리고 실행 스레드로 구성된다. 실행 스레드를 제외하면, 에이전트의 구성 요소는 오직 해당 에이전트에만 속한다.

에이전트실행 스레드는 다른 에이전트들과 독립적으로 그 에이전트의 실행 컨텍스트들에 대해 알고리즘 단계를 수행한다. 단, 스레드를 공유하는 에이전트들 중 어느 것도 [[CanBlock]] 필드가 true에이전트 레코드를 가지지 않는다면, 하나의 실행 스레드가 여러 에이전트실행 스레드로 사용될 수 있다.

Note 1

예를 들어, 일부 웹 브라우저는 브라우저 창의 서로 관련 없는 여러 탭 사이에서 하나의 실행 스레드를 공유한다.

에이전트실행 스레드가 알고리즘 단계를 실행하고 있는 동안, 그 단계들에 대해 해당 에이전트주변 에이전트이다. 그 단계들은 주변 에이전트를 사용하여 에이전트 내부에 보관된 명세 수준 실행 객체들, 즉 실행 중인 실행 컨텍스트, 실행 컨텍스트 스택, 그리고 에이전트 레코드의 필드들에 접근한다.

에이전트 식별자에이전트를 식별하는 데 사용되는 전역적으로 고유한 불투명 값이다.

Table 24: Agent Record Fields
필드 이름 의미
[[LittleEndian]] a Boolean GetValueFromBufferSetValueInBuffer 알고리즘이 isLittleEndian 매개변수를 필요로 할 때 계산되는 기본값이다. 이 선택은 구현 정의이며, 구현에 가장 효율적인 대안이어야 한다.
[[CanBlock]] a Boolean 에이전트가 블록될 수 있는지 여부를 결정한다.
[[Signifier]] an agent signifier 자신의 에이전트 클러스터 내에서 해당 에이전트를 고유하게 식별한다.
[[IsLockFree1]] a Boolean 1-바이트 값에 대한 원자적 연산이 lock-free이면 true, 그렇지 않으면 false이다.
[[IsLockFree2]] a Boolean 2-바이트 값에 대한 원자적 연산이 lock-free이면 true, 그렇지 않으면 false이다.
[[IsLockFree8]] a Boolean 8-바이트 값에 대한 원자적 연산이 lock-free이면 true, 그렇지 않으면 false이다.
[[CandidateExecution]] a candidate execution Record 메모리 모델을 보라.
[[KeptAlive]] a List of either Objects or Symbols 초기값은 새로운 빈 List이며, 현재 Job이 끝날 때까지 살아 있도록 유지해야 하는 객체 및/또는 심벌들의 목록을 나타낸다
[[ModuleAsyncEvaluationCount]] an integer 초기값은 0이며, 비동기적이거나 비동기 의존성을 가진 모듈의 [[AsyncEvaluationOrder]] 필드에 고유하게 증가하는 값을 할당하는 데 사용된다.

[[LittleEndian]], [[Signifier]], [[IsLockFree1]], [[IsLockFree2]], 그리고 [[IsLockFree8]]의 값은 변경될 수 없다.

Note 2

[[IsLockFree1]], [[IsLockFree2]], 그리고 [[IsLockFree8]]의 값은 반드시 하드웨어에 의해 결정되는 것은 아니며, ECMAScript 구현마다 그리고 시간에 따라 달라질 수 있는 구현 선택을 반영할 수도 있다.

[[IsLockFree4]] 필드는 없다: 4바이트 원자적 연산은 항상 lock-free이다.

실제로, 원자적 연산이 어떤 종류의 락으로 구현된다면 그 연산은 lock-free가 아니다. Lock-free는 wait-free를 의미하지 않는다: lock-free 원자적 연산을 완료하는 데 얼마나 많은 머신 단계가 필요할지에 대한 상한은 없다.

크기 n의 원자적 접근이 lock-free라는 사실은 크기 n의 비원자적 접근의 (인지된) 원자성에 대해 아무것도 의미하지 않는다. 특히 비원자적 접근은 여전히 여러 개의 개별 메모리 접근 시퀀스로 수행될 수 있다. 자세한 내용은 ReadSharedMemoryWriteSharedMemory를 보라.

Note 3

에이전트는 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다.

9.6.1 AgentSignifier ( )

The abstract operation AgentSignifier takes no arguments and returns an agent signifier. It performs the following steps when called:

  1. agentRecord주변 에이전트에이전트 레코드라고 하자.
  2. agentRecord.[[Signifier]]를 반환한다.

9.6.2 AgentCanSuspend ( )

The abstract operation AgentCanSuspend takes no arguments and returns a Boolean. It performs the following steps when called:

  1. agentRecord주변 에이전트에이전트 레코드라고 하자.
  2. agentRecord.[[CanBlock]]를 반환한다.
Note

일부 환경에서는 특정 에이전트가 중단될 수 있도록 하는 것이 합리적이지 않을 수 있다. 예를 들어 웹 브라우저 환경에서는 문서의 메인 이벤트 처리 스레드의 중단을 허용하지 않는 것이 합리적일 수 있지만, 워커의 이벤트 처리 스레드는 여전히 중단을 허용할 수 있다.

9.6.3 IncrementModuleAsyncEvaluationCount ( )

The abstract operation IncrementModuleAsyncEvaluationCount takes no arguments and returns a non-negative integer. It performs the following steps when called:

  1. agentRecord주변 에이전트에이전트 레코드라고 하자.
  2. countagentRecord.[[ModuleAsyncEvaluationCount]]라고 하자.
  3. agentRecord.[[ModuleAsyncEvaluationCount]]count + 1로 설정한다.
  4. count를 반환한다.
Note

이 값은 보류 중인 모듈들 사이의 상대적 평가 순서를 추적하는 데만 사용된다. 구현은 보류 중인 모듈이 없을 때마다 [[ModuleAsyncEvaluationCount]]를 관찰 불가능하게 0으로 재설정할 수 있다.

9.7 에이전트 클러스터

에이전트 클러스터는 공유 메모리에서 동작함으로써 통신할 수 있는 에이전트들의 최대 집합이다.

Note 1

서로 다른 에이전트 내의 프로그램들은 명시되지 않은 수단으로 메모리를 공유할 수 있다. 최소한 SharedArrayBuffer의 백킹 메모리는 클러스터 내 에이전트들 사이에서 공유될 수 있다.

메시지 전달로는 통신할 수 있지만 메모리를 공유할 수는 없는 에이전트들이 있을 수 있으며, 그러한 에이전트들은 결코 같은 에이전트 클러스터에 속하지 않는다.

모든 에이전트는 정확히 하나의 에이전트 클러스터에 속한다.

Note 2

클러스터에 속한 에이전트들이 어떤 특정 시점에 모두 살아 있을 필요는 없다. 에이전트 A가 다른 에이전트 B를 생성하고, 그 후 A가 종료되며 B에이전트 C를 생성하는 경우, AB와 어떤 메모리를 공유할 수 있었고 BC와 어떤 메모리를 공유할 수 있었다면 이 세 에이전트는 같은 클러스터에 속한다.

클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[LittleEndian]] 필드에 대해 같은 값을 가져야 한다.

Note 3

에이전트 클러스터 내의 서로 다른 에이전트들이 [[LittleEndian]]의 서로 다른 값을 가지면 다중 바이트 데이터에 공유 메모리를 사용하는 것이 어려워진다.

클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[IsLockFree1]] 필드에 대해 같은 값을 가져야 하며, [[IsLockFree2]][[IsLockFree8]] 필드도 마찬가지이다.

클러스터 내의 모든 에이전트는 각자의 에이전트 레코드에서 [[Signifier]] 필드에 대해 서로 다른 값을 가져야 한다.

임베딩은 에이전트의 지식이나 협조 없이 에이전트를 비활성화(전진 진행 중지)하거나 활성화(전진 진행 재개)할 수 있다. 임베딩이 그렇게 하는 경우, 클러스터 내 일부 에이전트는 활성 상태로 두면서 다른 에이전트들은 무기한 비활성화된 상태로 남겨두어서는 안 된다.

Note 4

앞선 제한의 목적은 다른 에이전트가 비활성화되었기 때문에 어떤 에이전트가 교착 상태에 빠지거나 기아 상태에 빠지는 상황을 피하는 것이다. 예를 들어, 어떤 창의 문서들과 독립된 수명을 가진 HTML 공유 워커가, 그러한 독립 문서의 전용 워커와 메모리를 공유하는 것이 허용되었고, 문서와 그 전용 워커가 전용 워커가 락을 쥔 상태에서 비활성화된다면(예를 들어 문서가 자신의 창 기록으로 밀려나는 경우), 그 후 공유 워커가 그 락을 획득하려고 하면 공유 워커는 전용 워커가 다시 활성화될 때까지, 혹은 영원히, 블록될 것이다. 그 사이 다른 창에서 공유 워커에 접근하려는 다른 워커들은 기아 상태에 빠질 것이다.

이 제한의 함의는, 임베딩 내에서 같은 suspend/wake 집합에 속하지 않는 에이전트들 사이에서는 메모리를 공유하는 것이 불가능하다는 점이다.

임베딩은 클러스터의 다른 에이전트들의 사전 지식이나 협조 없이 에이전트를 종료할 수 있다. 에이전트가 자기 자신이나 클러스터 내 다른 에이전트의 프로그램적 동작이 아니라 클러스터 외부의 힘에 의해 종료되는 경우, 임베딩은 두 가지 전략 중 하나를 선택해야 한다: 클러스터의 모든 에이전트를 종료하거나, 또는 클러스터 내 에이전트들이 조정할 수 있도록 신뢰할 수 있는 API를 제공하여 적어도 하나의 남아 있는 클러스터 구성원이 종료를 감지할 수 있게 해야 하며, 종료 데이터는 종료된 에이전트를 식별하기에 충분한 정보를 포함해야 한다.

Note 5

그러한 유형의 종료 예시는 다음과 같다: 별도 프로세스에서 실행 중인 에이전트를 운영체제나 사용자가 종료하는 경우; 또는 임베딩 자체가 다른 에이전트들과 같은 프로세스 내에서 실행 중인 에이전트를 종료하는 경우로, 에이전트별 자원 회계 결과 그 에이전트가 폭주 중이라고 나타나는 경우이다.

다음 명세 값 각각과, 그것들로부터 전이적으로 도달 가능한 값들은 정확히 하나의 에이전트 클러스터에 속한다.

클러스터 내 어떤 에이전트에 의한 어떤 ECMAScript 코드 평가보다도 먼저, 클러스터 내 모든 에이전트에 대한 에이전트 레코드[[CandidateExecution]] 필드는 초기 candidate execution으로 설정된다. 초기 candidate execution은 빈 candidate execution이며, 그 [[EventsRecords]] 필드는 각 에이전트마다 하나씩 Agent Events Record를 포함하는 List이다. 각 Agent Events Record[[AgentSignifier]] 필드는 해당 에이전트에이전트 식별자이고, [[EventList]][[AgentSynchronizesWith]] 필드는 빈 List이다.

Note 6

에이전트 클러스터 내의 모든 에이전트에이전트 레코드[[CandidateExecution]] 필드 안에서 같은 candidate execution을 공유한다. candidate execution메모리 모델에서 사용되는 명세 메커니즘이다.

Note 7

에이전트 클러스터는 명세 메커니즘이며, ECMAScript 구현의 어떤 특정 산출물과 대응할 필요는 없다.

9.8 전진 진행

에이전트전진 진행을 한다는 것은 이 명세에 따라 평가 단계를 수행하는 것을 의미한다.

에이전트의 실행 중인 실행 컨텍스트가 외부 이벤트를 동기적으로 그리고 무기한 기다릴 때, 그 에이전트블록된다. 이러한 의미에서 블록될 수 있는 것은 에이전트 레코드[[CanBlock]] 필드가 true에이전트뿐이다. 블록되지 않은 에이전트는 블록되지 않은 에이전트이다.

구현은 반드시 다음을 보장해야 한다:

Note

이것은 메모리 모델의 liveness 보장과 함께, 모든 seq-cst 쓰기가 결국 모든 에이전트에서 관찰 가능해짐을 보장한다.

9.9 WeakRef 및 FinalizationRegistry 대상의 처리 모델

9.9.1 목표

이 명세는 어떤 객체나 심벌이 가비지 컬렉션될 것이라는 어떠한 보장도 하지 않는다. 살아 있지 않은 객체나 심벌은 오랜 시간이 지난 뒤에 해제될 수도 있고, 아예 해제되지 않을 수도 있다. 이러한 이유로, 이 명세는 가비지 컬렉션에 의해 유발되는 동작을 설명할 때 "may"라는 용어를 사용한다.

WeakRefFinalizationRegistry의 의미론은 특정 시점에 일어나는 두 연산을 기반으로 한다:

이 두 동작(ClearKeptObjects 또는 CleanupFinalizationRegistry) 중 어느 것도 동기 ECMAScript 실행을 중단시켜서는 안 된다. 호스트는 더 긴 동기 ECMAScript 실행 구간을 구성할 수 있기 때문에, 이 명세는 ClearKeptObjectsCleanupFinalizationRegistry의 스케줄링을 호스트 환경에 위임한다.

일부 ECMAScript 구현은 ECMAScript가 유휴 상태일 때를 포함해 백그라운드에서 실행되는 가비지 컬렉터 구현을 포함한다. 호스트 환경CleanupFinalizationRegistry를 스케줄할 수 있게 하면, finalizer 작업을 실행하기 위해 ECMAScript 실행을 재개할 수 있고, 이로 인해 held value를 해제하여 전체 메모리 사용량을 줄일 수 있다.

9.9.2 Liveness

어떤 객체 및/또는 심벌들의 집합 objectSet에 대해, objectSet에 관한 가정적 WeakRef-무시 실행이란, referent가 objectSet의 원소인 WeakRef추상 연산 WeakRefDeref가 항상 undefined를 반환하는 실행을 말한다.

Note 1
WeakRef-무시성과 liveness는 함께 두 가지 개념을 포착한다. 첫째, WeakRef 자체는 referent를 살아 있게 유지하지 않는다는 점이다. 둘째, liveness의 순환이 어떤 값이 살아 있음을 의미하지는 않는다는 점이다. 구체적으로 말하면, v의 liveness를 결정하는 일이 WeakRef referent인 r의 liveness를 결정하는 데 의존한다면, r의 liveness는 v의 liveness를 가정할 수 없는데, 이는 순환 논법이 되기 때문이다.
Note 2
WeakRef-무시성은 순환을 고려하기 위해 개별 값이 아니라 객체나 심벌의 집합에 대해 정의된다. 만약 개별 값에 대해 정의된다면, 순환 안에 있는 WeakRef referent는 그 정체성이 오직 순환 안의 다른 WeakRef referent를 통해서만 관찰되더라도 살아 있는 것으로 간주될 것이다.
Note 3
구어적으로, 어떤 개별 객체 또는 심벌을 포함하는 모든 집합이 live라면 그 객체 또는 심벌은 live하다고 말한다.

평가 중 어느 시점에서든, 객체 및/또는 심벌들의 집합 objectSet은 다음 조건 중 하나라도 만족하면 live하다고 간주된다:

  • objectSet의 어떤 원소든 임의의 에이전트[[KeptAlive]] List에 포함된다.
  • objectSet에 관해 유효한 미래의 가정적 WeakRef-무시 실행이 존재하며, 그 실행이 objectSet 안의 어떤 값의 정체성을 관찰한다.
Note 4
위의 두 번째 조건은 어떤 값의 정체성이 비-WeakRef 수단으로 관찰 가능하다면 그 값이 live하다는 직관을 포착하려는 것이다. 값의 정체성은 strict equality 비교를 관찰하거나, 그 값이 Map의 key로 사용되는 것을 관찰함으로써 관찰될 수 있다.
Note 5

객체나 심벌이 어떤 필드, 내부 슬롯, 또는 프로퍼티 안에 존재한다고 해서 그 값이 live하다는 뜻은 아니다. 예를 들어 해당 값이 결코 프로그램으로 다시 전달되지 않는다면, 그 값은 관찰될 수 없다.

이는 WeakMap의 key, WeakSet의 member, 그리고 FinalizationRegistry Cell record의 [[WeakRefTarget]][[UnregisterToken]] 필드의 경우에 해당한다.

위 정의는, WeakMap의 key가 live하지 않다면 그에 대응하는 value도 반드시 live한 것은 아니라는 점을 함의한다.

Note 6
Liveness는 엔진이 비워서는 안 되는 WeakRef를 보장하는 하한이다. 여기서 정의된 liveness는 결정 불가능하다. 실제로 엔진은 도달 가능성과 같은 보수적 근사를 사용한다. 구현에는 상당한 재량이 기대된다.

9.9.3 실행

어느 시점에서든, 객체 및/또는 심벌들의 집합 objectSetlive하지 않다면, ECMAScript 구현은 다음 단계를 원자적으로 수행할 수 있다:

  1. objectSet의 각 원소 value에 대해, 다음을 수행한다
    1. ref.[[WeakRefTarget]]value인 각 WeakRef ref에 대해, 다음을 수행한다
      1. ref.[[WeakRefTarget]]empty로 설정한다.
    2. fg.[[Cells]]cell.[[WeakRefTarget]]valueRecord cell을 포함하는 각 FinalizationRegistry fg에 대해, 다음을 수행한다
      1. cell.[[WeakRefTarget]]empty로 설정한다.
      2. 선택적으로, HostEnqueueFinalizationRegistryCleanupJob(fg)를 수행한다.
    3. map.[[WeakMapData]]r.[[Key]]valueRecord r을 포함하는 각 WeakMap map에 대해, 다음을 수행한다
      1. r.[[Key]]empty로 설정한다.
      2. r.[[Value]]empty로 설정한다.
    4. set.[[WeakSetData]]value를 포함하는 각 WeakSet set에 대해, 다음을 수행한다.
      1. set.[[WeakSetData]]에서 값이 value인 원소를 값이 empty인 원소로 교체한다.
Note 1

liveness의 정의와 함께, 이 절은 구현이 WeakRef와 관련하여 적용할 수 있는 최적화를 규정한다.

객체의 정체성을 관찰하지 않고도 객체에 접근하는 것은 가능하다. 정체성이 관찰되지 않는 비탈출 객체의 프로퍼티에 대한 dead variable elimination이나 scalar replacement 같은 최적화는 허용된다. 따라서 이러한 최적화는 그러한 객체를 가리키는 WeakRef를 관찰 가능하게 비우는 것도 허용된다.

반면에 어떤 객체의 정체성이 관찰 가능하고, 그 객체가 WeakRef[[WeakRefTarget]] 내부 슬롯 안에 있다면, WeakRef를 관찰 가능하게 비우는 rematerialization 같은 최적화는 금지된다.

HostEnqueueFinalizationRegistryCleanupJob 호출은 선택적이므로, FinalizationRegistry에 등록된 객체가 반드시 그 FinalizationRegistrylive하게 유지하는 것은 아니다. 구현은 예를 들어 FinalizationRegistry 자체가 죽었거나, 애플리케이션이 종료 중인 경우 등 어떤 이유로든 FinalizationRegistry callback을 생략할 수 있다.

Note 2

구현은 live하지 않은 객체나 심벌의 최대 집합에 대해 WeakRef를 비울 의무가 없다.

구현이 WeakRef를 비울 live하지 않은 집합 objectSet을 선택한다면, 이 정의는 objectSet 안의 모든 값에 대한 WeakRef를 동시에 비워야 함을 요구한다. 즉, 구현이 어떤 값 v를 가리키는 WeakRef를 비우면서, 비워지지 않을 경우 v의 값을 관찰하는 실행이 가능해질 수 있는 다른 WeakRef는 비우지 않는 것은 적합하지 않다.

9.9.4 호스트 훅

9.9.4.1 HostEnqueueFinalizationRegistryCleanupJob ( finalizationRegistry )

The host-defined abstract operation HostEnqueueFinalizationRegistryCleanupJob takes argument finalizationRegistry (a FinalizationRegistry) and returns unused.

finalizationRegistry를 캡처하고, 호출될 때 다음 단계를 수행하는 매개변수 없는 새로운 Job Abstract ClosurecleanupJob이라고 하자:

  1. cleanupResultCompletion(CleanupFinalizationRegistry(finalizationRegistry))라고 하자.
  2. cleanupResultabrupt completion이면, 오류를 보고하기 위한 호스트 정의 단계를 수행한다.
  3. unused를 반환한다.

HostEnqueueFinalizationRegistryCleanupJob의 구현은 가능하다면 cleanupJob이 미래의 어느 시점에 수행되도록 스케줄한다. 또한 9.5의 요구 사항도 준수해야 한다.

9.10 ClearKeptObjects ( )

The abstract operation ClearKeptObjects takes no arguments and returns unused. ECMAScript 구현은 동기적인 ECMAScript 실행 시퀀스가 완료될 때 ClearKeptObjects를 호출할 것으로 기대된다. It performs the following steps when called:

  1. agentRecord주변 에이전트에이전트 레코드라고 하자.
  2. agentRecord.[[KeptAlive]]를 새로운 빈 List로 설정한다.
  3. unused를 반환한다.

9.11 AddToKeptObjects ( value )

The abstract operation AddToKeptObjects takes argument value (an Object or a Symbol) and returns unused. It performs the following steps when called:

  1. agentRecord주변 에이전트에이전트 레코드라고 하자.
  2. valueagentRecord.[[KeptAlive]]에 추가한다.
  3. unused를 반환한다.
Note
추상 연산 AddToKeptObjects가 대상 객체 또는 심벌과 함께 호출되면, ClearKeptObjects가 호출될 때까지 그 대상 객체 또는 심벌을 강하게 가리키는 목록에 그 대상을 추가한다.

9.12 CleanupFinalizationRegistry ( finalizationRegistry )

The abstract operation CleanupFinalizationRegistry takes argument finalizationRegistry (a FinalizationRegistry) and returns either a normal completion containing unused or a throw completion. It performs the following steps when called:

  1. Assert: finalizationRegistry[[Cells]][[CleanupCallback]] 내부 슬롯을 가진다.
  2. callbackfinalizationRegistry.[[CleanupCallback]]이라고 하자.
  3. finalizationRegistry.[[Cells]]cell.[[WeakRefTarget]]emptyRecord cell을 포함하는 동안, 구현은 다음 단계를 수행할 수 있다:
    1. 그러한 cell 중 임의의 것을 선택한다.
    2. cellfinalizationRegistry.[[Cells]]에서 제거한다.
    3. HostCallJobCallback(callback, undefined, « cell.[[HeldValue]] »)를 수행한다.
  4. unused를 반환한다.

9.13 CanBeHeldWeakly ( v )

The abstract operation CanBeHeldWeakly takes argument v (an ECMAScript language value) and returns a Boolean. 이것은 v가 약한 참조로 사용되기에 적합한 경우에만 true를 반환한다. 약한 참조로 사용되기에 적합한 값만이 WeakMap의 키, WeakSet의 원소, WeakRef의 대상, 또는 FinalizationRegistry의 대상들 중 하나가 될 수 있다. It performs the following steps when called:

  1. v가 Object이면, true를 반환한다.
  2. v가 Symbol이고 KeyForSymbol(v)가 undefined이면, true를 반환한다.
  3. false를 반환한다.
Note

언어적 동일성이 없는 언어 값은 사전 참조 없이도 나타날 수 있으며, 약한 참조로 사용되기에 부적합하다. Symbol.for에 의해 생성된 Symbol 값은 다른 Symbol 값과 달리 언어적 동일성을 가지지 않으며, 약한 참조로 사용되기에 부적합하다. well-known symbol은 수집되지 않을 가능성이 높지만, 개수가 제한되어 있어 다양한 구현 접근법으로 관리 가능하므로 여전히 약한 참조로 사용되기에 적합한 것으로 취급된다. 그러나 live한 WeakMap 안에서 well-known symbol에 연관된 어떤 값이든 수집되지 않을 가능성이 높으며, 구현에서 메모리 자원을 “누수”시킬 수 있다.