Strict mode는 자바스크립트 언어의 문법을 보다 더 엄격하게 적용하여 기존에는 무시되던 오류 발생 요소나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킨다. 평소 ESLint와 같은 도구를 사용했었는데 이와 비슷한 기능을 하는 것이라고 볼 수 있는 것 같다.
오류를 줄여 안정적인 코드를 생산하기 위해, 잠재적으로 오류를 발생시킬 수 있는 요소들을 제거하고 이를 타이트하게 관리하는 개발환경을 만들어준다고 보면 될 것 같은데 지금까지는 써본적이 없는 것 같다?
ESLint를 사용하면 코딩 컨벤션을 파일 안에서 정리하여 보다 더 간편하게 적용할 수 있기에 많은 사람들이 아마 ESLint를 사용하고 있을 것이다. 그래도 Strict mode라는 것도 있다고 하니 어떻게 사용하는지 살펴보자.
1. Strict mode 적용방법
strict mode를 적용하기 위해서는 전역의 선두 또는 함수 몸체의 선두에 'use strict';를 추가한다. 이 때, 전역에 추가하게 되면 스크립트 전체에 strict mode가 적용되고 함수 안에 선언하면 해당 함수와 중첩된 내부 함수에 strict mode가 적용된다.
// 전역에 선언
'use strict';
function hello() {
x = '안녕'; // ReferenceError: x is not defined
}
hello();
// 함수 몸체에 선언
function hello() {
'use strict';
x = '안녕'; // ReferenceError: x is not defined
}
hello();
해당 위치에 제대로 선언해주지 않으면 strict mode가 제대로 실행되지 않는다. 이런 방식으로 strict mode를 실행시킬 수 있는데 전역 or 함수 몸체에 strict mode를 적용시키는 것은 피하는게 좋다고 한다.
strict mode는 스크립트 단위로 적용이 되는데 외부 서드 파티 라이브러리를 사용하는 경우, 라이브러리가 non-strict mode일 수도 있기 때문에 전역에 strict mode를 적용하는 것은 바람직하지 않다고 한다. 또한, 함수 단위 역시 되도록이면 사용하지 않는 것이 좋다고 하는데 strict mode가 적용된 함수가 참조할 외부 컨텍스트에 strict mode를 적용하지 않는다면 이에 따른 문제가 발생할 수 있기 때문이다.
이렇게 보면 그냥 ESLint를 사용하는게 편한 것 같다.
2. Strict mode 제약 조건
strcit mode를 적용하면 다음과 같은 제약사항이 따른다.
- 전역 변수를 사용할 수 없다.
- 선언되지 않은 변수를 참조할 수 없다.
- 중복된 함수 파라미터 이름을 사용할 수 없다.
- with 문을 사용할 수 없다.
- strict mode 에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다.
- delete 키워드를 사용할 수 없다.
- arguments 객체 요소 값을 변경할 수 없다.
- IE9 이하는 지원하지 않는다.
- 실수를 에러로 반환한다.
- eval을 변수 또는 함수, 매개 변수 이름으로 사용할 수 없다.