TypeScript와 ESLint가 있는데 왜 'use strict'를 알아야 할까? 런타임 제어와 정적 분석의 차이를 이해한다.
“use strict” 는 JavaScript 코드에 보다 엄격한 오류 검사를 적용하는 실행 모드다.
"use strict"; 지시어를 사용하면, 기존에는 조용히 무시되던 잠재적인 문제나 나쁜 문법들을 "에러" 로 간주하여 코드의 안정성과 품질을 높일 수 있다.
JavaScript는 기본적으로 유연하게 설계되어 개발자의 작은 실수를 너그럽게 넘어가려는 경향이 있다(Sloppy Mode). 이는 소스 코드 작성 시 편리할 수 있지만, 디버깅하기 어려운 미묘한 버그의 원인이 되기도 한다. 이를 해결하기 위해 ECMAScript 5에서 엄격 모드가 도입되었다.
엄격 모드는 단순한 문법 제약을 넘어 다음과 같은 확실한 이점을 제공한다.
ReferenceError)로 잡는다.eval() 함수의 스코프를 제한하고, 전역 컨텍스트에서 this가 window 객체를 가리키는 것을 방지한다.implements, interface, package 등 미래의 ECMAScript 버전에서 사용될 예약어를 변수명으로 쓰지 못하게 막는다."요즘은 TypeScript나 ESLint가 다 잡아주는데, 엄격 모드가 의미가 있나?"라는 의문이 들 수 있다.
결론부터 말하자면, 이들은 동작하는 시점과 역할이 근본적으로 다르다.
엄격 모드는 엔진의 동작을 바꾸고, 툴링(TS/ESLint)은 코드 검사를 담당한다.
| 구분 | "use strict" (엄격 모드) | TypeScript / ESLint |
|---|---|---|
| 핵심 역할 | JavaScript 엔진의 실행 방식(Behavior) 변경 | 코드의 정적 분석(Static Analysis) 및 검사 |
| 동작 시점 | 런타임 (Runtime) (브라우저/Node.js 실행 중) | 컴파일/개발 타임 (에디터 저장 시, 빌드 시) |
| 주요 기능 | • this 바인딩 변경• "조용한 실패"를 에러로 전환 • delete 불가 속성 삭제 시 에러 발생 | • 타입 오류 검출 • 코드 스타일 강제 • 잠재적 버그 패턴 감지 |
ESLint는 개발자에게 "이거 틀렸어"라고 말해줄 수 있지만, **런타임 동작(this가 무엇을 가리키는지 등)**을 바꿀 수는 없다.
반면 엄격 모드는 엔진이 코드를 해석하고 실행하는 규칙 자체를 변경한다.
현대 JavaScript 생태계에서는 개발자가 직접 "use strict";를 타이핑할 일이 거의 없다.
ES 모듈(import / export)을 사용하는 파일은 자동으로 엄격 모드가 적용된다.
JavaScript의 class 문법 내부의 코드도 기본적으로 엄격 모드로 동작한다.
TypeScript 프로젝트나 Webpack, Vite 같은 번들러를 사용하면, 빌드 과정에서 결과물 상단에 "use strict";를 자동으로 주입해주거나 모듈 시스템을 통해 적용된다.
우리는 이미 엄격 모드의 보호 아래 살고 있다.
하지만 레거시 코드를 다루거나, HTML 내부의 <script> 태그에 직접 코드를 작성할 때는 이 차이를 명확히 인지하고 있어야 디버깅 시간을 단축할 수 있다.