cd ../
Runtime·2026-01-14·4 min read·# entry/005

JavaScript 엄격 모드('use strict'): 런타임의 안전벨트

TypeScript와 ESLint가 있는데 왜 'use strict'를 알아야 할까? 런타임 제어와 정적 분석의 차이를 이해한다.

“use strict” 는 JavaScript 코드에 보다 엄격한 오류 검사를 적용하는 실행 모드다.

"use strict"; 지시어를 사용하면, 기존에는 조용히 무시되던 잠재적인 문제나 나쁜 문법들을 "에러" 로 간주하여 코드의 안정성과 품질을 높일 수 있다.

JavaScript는 기본적으로 유연하게 설계되어 개발자의 작은 실수를 너그럽게 넘어가려는 경향이 있다(Sloppy Mode). 이는 소스 코드 작성 시 편리할 수 있지만, 디버깅하기 어려운 미묘한 버그의 원인이 되기도 한다. 이를 해결하기 위해 ECMAScript 5에서 엄격 모드가 도입되었다.

1. 엄격 모드를 사용하는 이유

엄격 모드는 단순한 문법 제약을 넘어 다음과 같은 확실한 이점을 제공한다.

엄격 모드의 혜택
  • 실수 방지: 오타로 인해 전역 변수가 생성되거나, 선언되지 않은 변수에 값을 할당하는 실수를 즉시 에러(ReferenceError)로 잡는다.
  • 보안 강화: eval() 함수의 스코프를 제한하고, 전역 컨텍스트에서 thiswindow 객체를 가리키는 것을 방지한다.
  • 성능 최적화: JS 엔진이 코드를 더 효율적으로 분석할 수 있도록 모호한 문법을 배제하여 최적화를 돕는다.
  • 미래 대비: implements, interface, package 등 미래의 ECMAScript 버전에서 사용될 예약어를 변수명으로 쓰지 못하게 막는다.

2. TypeScript와 ESLint가 있는데 굳이?

"요즘은 TypeScript나 ESLint가 다 잡아주는데, 엄격 모드가 의미가 있나?"라는 의문이 들 수 있다.

결론부터 말하자면, 이들은 동작하는 시점역할이 근본적으로 다르다.

엄격 모드는 엔진의 동작을 바꾸고, 툴링(TS/ESLint)은 코드 검사를 담당한다.

구분"use strict" (엄격 모드)TypeScript / ESLint
핵심 역할JavaScript 엔진의 실행 방식(Behavior) 변경코드의 정적 분석(Static Analysis) 및 검사
동작 시점런타임 (Runtime)
(브라우저/Node.js 실행 중)
컴파일/개발 타임
(에디터 저장 시, 빌드 시)
주요 기능this 바인딩 변경
• "조용한 실패"를 에러로 전환
delete 불가 속성 삭제 시 에러 발생
• 타입 오류 검출
• 코드 스타일 강제
• 잠재적 버그 패턴 감지
핵심 차이

ESLint는 개발자에게 "이거 틀렸어"라고 말해줄 수 있지만, **런타임 동작(this가 무엇을 가리키는지 등)**을 바꿀 수는 없다.

반면 엄격 모드는 엔진이 코드를 해석하고 실행하는 규칙 자체를 변경한다.


3. 그래서 신경 써서 개발해야 할까?

현대 JavaScript 생태계에서는 개발자가 직접 "use strict";를 타이핑할 일이 거의 없다.

1

모듈 시스템의 기본 적용

ES 모듈(import / export)을 사용하는 파일은 자동으로 엄격 모드가 적용된다.

2

클래스 문법

JavaScript의 class 문법 내부의 코드도 기본적으로 엄격 모드로 동작한다.

3

TypeScript와 번들러

TypeScript 프로젝트나 Webpack, Vite 같은 번들러를 사용하면, 빌드 과정에서 결과물 상단에 "use strict";를 자동으로 주입해주거나 모듈 시스템을 통해 적용된다.

Conclusion

우리는 이미 엄격 모드의 보호 아래 살고 있다.

하지만 레거시 코드를 다루거나, HTML 내부의 <script> 태그에 직접 코드를 작성할 때는 이 차이를 명확히 인지하고 있어야 디버깅 시간을 단축할 수 있다.