더북(TheBook)

Note ≣ 단순하지 않은 매개변수 목록 및 엄격한 모드 변경

기본값이나 배우게 될 다른 ES2015+ 매개변수 기능이 없는 단순한 매개변수 목록인 매개변수 목록을 “단순” 매개변수 목록이라고 한다. 매개변수 목록이 새로운 기능을 사용하는 경우 이를 “단순하지 않은” 매개변수 목록(기발하지 않는가?)이라고 한다.

놀랍게도 단순하지 않은 매개변수 목록이 있는 함수는 "use strict" 지시문을 가질 수 없다.

function example(answer = 42) {
    "use strict";        // SyntaxError: Illegal 'use strict' directive
                         // 단순하지 않은 매개변수 목록이 있는 함수
    console.log(answer);
}

왜 이것이 오류일까? 해당 함수가 느슨한 모드 코드로 정의되면 지시문이 함수 내에서 엄격 모드를 활성화하기 때문이다. 문제는 단순하지 않은 매개변수 목록이 매개변수 목록 내에서 발생하는 자동 처리(예: 기본값 적용)를 효과적으로 포함한다는 것이다. 함수 정의가 느슨한 모드로 나타나지만 함수가 “엄격 사용”으로 시작하는 경우 매개변수 목록의 코드가 엄격 모드 또는 느슨한 모드이어야 할까? 다음 코드를 살펴보자.

function example(callback = o => { with (o) { return answer; } }) {
    "use strict";
    console.log(callback({answer: 42}));
}

구문 오류일까(엄격 모드에서는 with가 허용되지 않기 때문에)? 매개변수 목록이 엄격하거나 느슨할까?

이 질문이 제기하는 혼란을 피하기 위해 함수는 그렇게 할 수 없다. 또한 구문 분석의 복잡성을 피하기 위해 함수 정의가 이미 엄격한 컨텍스트에 표시되더라도 단순하지 않은 매개변수 목록이 있는 경우 "use strict" 지시문을 가질 수 없다. 정의된 컨텍스트의 엄격함만 상속할 수 있다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.