모던 자바스크립트 Deep Dive
20장 strict mode
ecoEarth
2023. 7. 31. 00:04
Overview
- strict mode란?
- strict mode의 적용
- 전역에 strict mode를 적용하는 것은 피하자
- 함수 단위로 strict mode를 적용하는 것도 피하자
- strict mode가 발생시키는 에러
- strict mode 적용에 의한 변화
strict mode란?
function foo() {
x = 10;
}
foo();
console.log(x); // ?
스코프를 배웠다면, 당연히 에러가 날것이라고 예상했겠지만 위의 코드출력값은 놀랍게도 10이다.
변수 선언이 없는 할당이므로 함수의 스코프에 존지하지 않고, 스코프체이닝에 의해 전역 스코프를 찾아봐도 존재하지 않는다. 따라서 위의 코드는 에러를 발생시킬 것 가지만 놀랍게도 10이 출력된다. 이는 자바스크립트 엔진이 암묵적으로 전역 객체에 x 프로퍼티를 동적을 생성하기때문이고, 이를 암묵적 전역이라 한다. 이렇게 오타나 문법 지식의 미비로 인산 실수는 언제나 발생한다. 따라서 잠재적인 오류를 발생시키기 어려운 개발 환경을 만들고 그 환경에서 개발하는 것이 좀 더 근본적인 해결책이라고 할 수 있다.
- 이러한 환경을 지원하기 위해 ES5부터 strict mode가 추가되었다.
strict mode의 적용
'use strict';
function foo() {
x = 10; // ReferenceError: x is not defined
}
foo();
- strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 'use strict';를 추가한다.
- 전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.
전역에 strict mode를 적용하는 것은 피하자
- 스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지 않고 해당 스크립트에 한정되어 적용된다.
- 하지만 strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다.
- 특히 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있기 때문에 전역에 strict mode를 적용하는 것은 바람직하지 않다
함수 단위로 strict mode를 적용하는 것도 피하자
// 즉시 실행 함수의 선두에 strict mode 적용
(function () {
'use strict';
console.log(3);
}());
- 함수 단위로 strict mode를 적용할 수도 있다. 그러나 어떤 함수는 strict mode를 적용하고 어떤 함수는 strict mode를 적용하지 않는 것은 바람직하지 않으며 모든 함수에 일일이 strict mode를 적용하는 것은 번거로운 일이다.
- strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 이 또한 문제가 발생할 수 있다.
- 따라서 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.
strict mode가 발생시키는 에러
- 암묵적 전역
- 변수, 함수, 매개변수의 삭제
- 매개변수 이름의 중복
- with문의 사용
strict mode 적용에 의한 변화
- 일반 함수의 this
- strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다. 생성자 함수가 아닌 일반
함수 내부에서는 this를 사용할 필요가 없기 때문이다. 이때 에러는 발생하지 않는다.
- strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다. 생성자 함수가 아닌 일반
- arguments 객체
- strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.