티스토리 뷰
이 글은 주니어 개발자가 쓴 글로 오류가 있을 수 있습니다.
문제가 있거나 수정이 필요한 부분은 댓글로 알려주시면 감사하겠습니다.
ES5부터 추가된 strict mode란 무엇이고, 적용 시에 어떤 점이 달라지는지 알아보겠습니다.
strict mode란?
strict mode(엄격 모드)는 ES5부터 추가된 더 엄격한 문법 검사를 시행하는 모드로 non-strict mode와는 아래와 같은 차이가 있습니다.
(strict mode의 반대는 non-strict mode 혹은 sloppy mode(느슨한 모드)입니다. 정식 명칭은 아니라고 합니다.)
- 기존에는 무시되던 경우를 에러로 발생시킵니다.
- JavaScript 엔진의 최적화 작업을 어렵게 만드는 실수를 바로 잡아줍니다.
- 이후 버전에서 사용될 몇 가지 문법을 사용하지 못하게 미리 금지합니다.
- 안전하지 않은 액션을 막아줍니다.
- 혼란을 야기하는 기능의 사용을 금지합니다.
간단히 말하면, JavaScript를 좀 더 안전하게('secure') 사용할 수 있게 돕는 기능입니다.
적용 방법
적용 방법은 간단합니다. 프로그램 혹은 함수의 최상단에 "use strict"; 혹은 'use strict';를 선언하면 적용됩니다. ES6에서 추가된 class와 모듈은 별도로 적용하지 않아도 strict mode가 적용됩니다. (ES5 이전의 환경에서는 이 문장이 무시됩니다.)
'use strict'; // 프로그램 최상단에 적용. 프로그램 전체 코드에 strict mode 적용
let v = "strict mode script!";
function strict() {
'use strict'; // 함수의 최상단에 적용. 해당 함수 내의 코드에만 strict mode 적용
let test = 'strict mode function';
}
test1 = 1; // 에러 발생하지 않음
'use strict'; // 최상단이 아닌 곳에 적용할 경우, strict mode 적용 안됨
test2 = 2; // 에러 발생하지 않음
사용 예시
에러 발생으로 실수 최소화
- 선언하지 않은 변수 참조 불가
non-strict mode에서는 선언하지 않은 변수를 참조할 경우, 자바 스크립트 엔진이 암묵적으로 전역 객체에 프로퍼티로 생성합니다. 이를 암묵적 전역(implicit global)이라고 합니다. - 매개변수 이름 중복 불가
- 0-prefixed 8진수 리터럴 혹은 8진수 이스케이프 시퀀스 표현 사용 불가
0 뒤에 소문자 또는 대문자 'o'를 붙이면 8진수로 표현 가능합니다(0o 혹은 0O). 이 항목은 의도적으로 0-prefixed 8진수를 사용하는 경우도 있지만, 잘 모르고 실수로 사용하는 경우도 있어서 에러가 발생하는 것 같습니다. - read-only 프로퍼티 / get-only 프로퍼티 수정 불가
- 원시 값에 프로퍼티 추가 불가
변수 사용 단순화
- with문 사용 불가
- 일반 이름(객체의 프로퍼티가 아닌 값)(plain names) 삭제 불가
eval, arguments 사용 단순화
- eval, arguments 변수명으로 사용 불가
- arguments에 재할당 불가
- arguments.callee 사용 불가
JavaScript 보안 강화
- 일반 함수의 this는 undefined로 바인딩
non-strict mode에서는 전역 객체(window)가 바인딩됩니다. - Function.caller, Function.arguments 사용 불가
- 매개변수에 재할당하여도 arguments 객체에는 반영되지 않음
차후 버전을 위한 준비
- implements, interface, let, package, private, protected, public, static, yield 식별자로 사용 불가
주의 사항
strict mode는 모든 최신 브라우저에서 지원을 하고 IE도 IE10부터 지원하고 있지만 모든 브라우저에서 지원하는 것은 아닙니다. strict mode는 non-strict mode와 문법이 다르기 때문에(Strict mode changes semantics.) strict mode의 문법에 의존하는 코드를 작성할 경우에는(예를 들어, 함수의 매개변수를 변경하여도 arguments는 변경되지 않음을 이용한 코드 등) 지원하지 않는 브라우저에서의 동작을 주의해야 합니다.
또한, <script> 단위로 적용할 때에는 해당 스크립트에만 strict mode가 적용됩니다. 가장 추천되는 사용 방법은 IIFE(Immediately Invoked Function Expression, 즉시 실행 함수)로 감싼 코드 단위로 적용하는 것입니다.
참고 자료
'Web 개발 > 자바스크립트' 카테고리의 다른 글
JavaScript | Event Type(이벤트 타입) (0) | 2021.05.31 |
---|---|
JavaScript | Event(이벤트) (0) | 2021.05.28 |
[JS] 클라이언트 스토리지 (0) | 2018.11.21 |
[JS] HTTP 스크립팅 (0) | 2018.11.15 |
[JS] Window 객체와 Document 객체(Dom) (0) | 2018.11.15 |
- errno 253
- node mkdir -p
- make-dir
- rimraf
- javascript event
- 웹팩 에러
- createAction
- 인가
- node fs
- file opener preference
- 스터디
- sass
- ModuleParseError: Module parse failed: Unexpected token
- fs-extra
- ECONNRESET
- node file package
- Storybook Error
- JavaScript
- Webpack Error
- node rm -rf
- external editor
- 인증
- 프로그래머스
- ELIFECYCLE
- node cp -r
- 자바스크립트
- 페이지 특정 위치 link
- 스토리북 에러
- jest
- mkdirp