스트릭트 모드


스트릭트 모드는 ES5에 추가된 기존 자바스크립트가 가지고 있는 허점들을 보완하기 위한 기능입니다. 이름에서 알 수 있듯이 기존에 비해 조금더 엄격(strict)하게 문법을 검사합니다. 주로 의도치 않게 전역 스코프를 오염시키는 경우를 방지하기 위한 제약이 많아졌습니다.

사용법

스트릭트 모드를 사용하기 위해서는 전역 또는 함수 스코프의 가장 위에 "use strict"; 또는 'use strict';를 써주면 됩니다. 블록 스코프에서는 스트릭트 모드를 적용시킬 수 없습니다. 또 ES6에서 추가된 module은 기본적으로 스트릭트 모드가 적용됩니다.

여기서 전역 스코프에서 스트릭트 모드를 쓰는 것은 권장하지 않는데 외부에서 불러온 스크립트 또한 스트릭트 모드에서 실행되므로 예상할 수 없는 오류가 발생할 수 있기 때문입니다. 따라서 스트릭트모드를 사용할 때는 IIFE를 사용하거나 아니면 그냥 모듈을 사용합니다...

스트릭트 모드에서의 변경점

관련 MDN 문서를 보면 생각보다 변경점이 꽤 많은데, 저 중에서는 이게 원래 됐다고? 싶은 것들도 많아서 중요하다고 생각하는 것만 정리해 보겠습니다. 전체 변경점은 MDN에 잘 정리돼있습니다.

생성되지 않은 전역변수 에러 처리

실행 스코프에 변수 x가 선언되지 않았다면 스트릭트 모드가 아닐 때는 글로벌 스코프에 x라는 변수를 생성했습니다. 스트릭트 모드에서는 에러를 일으키도록 변경됩니다.

x = 10;

8진수 리터럴 포맷 변경

기존에 0을 앞에 붙여 8진수를 표현한 것을 0o를 붙여야 하는것으로 변경됩니다. 스트릭트 모드에서 012같은 숫자 리터럴을 사용하면 에러가 발생합니다.

eval 내의 변수 선언

더이상 eval 내에서 선언한 변수가 외부 스코프에 노출되지 않습니다. 기존에는 eval("var x = 10;");같은 코드를 실행하면 외부에서 x에 접근할 수 있었지만 스트릭트 모드에서는 eval 내부에서만 접근할 수 있습니다.

참고 문서

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode