본문으로 건너뛰기
김신건의 로그

[Javascript] strict mode

· 수정 · 📖 약 1분 · 367자/단어 #javascript #strict-mode #fundamentals
JS strict mode, use strict, 엄격 모드

정의

'use strict' 디렉티브로 활성화되는 엄격 실행 모드. ES5 도입. 위험한 문법을 에러로 만들어 코드 안전성 향상.

ES module 과 class 본문은 자동으로 strict mode.

사용

// 파일 최상단
'use strict';

// 또는 함수 내부
function foo() {
    'use strict';
    // ...
}

strict mode 의 효과

1. 선언 안 한 변수에 할당 시 ReferenceError

// sloppy
function foo() {
    x = 1;     // 실수로 var 빼먹음 → global 변수 생성!
}

// strict
function foo() {
    'use strict';
    x = 1;     // ❌ ReferenceError
}

global 오염 방지.

2. 중복 매개변수 금지

function foo(a, a) { ... }      // sloppy 에서는 동작
function foo(a, a) { ... }      // strict → SyntaxError
'use strict';

3. 8 진수 리터럴 금지

const x = 010;          // sloppy: 8 (8진수 8)
'use strict';
const x = 010;          // ❌ SyntaxError
const y = 0o10;         // ES6 표준 8진수 표기

4. delete 의 제한

'use strict';
delete Object.prototype;     // ❌ TypeError (변경 불가)

var x = 1;
delete x;                     // ❌ SyntaxError (변수 삭제 불가)

5. this 의 변화

function foo() {
    console.log(this);
}

foo();                  // sloppy: window/global
'use strict';
foo();                  // strict: undefined

명시적으로 this 를 지정하지 않은 호출에서 더 안전.

6. with 금지

'use strict';
with (obj) { ... }     // ❌ SyntaxError

7. arguments 의 immutable

function foo(a) {
    'use strict';
    a = 99;
    console.log(arguments[0]);    // 호출 시 전달된 원본 값
}

sloppy 모드에서는 a 변경이 arguments[0] 에 반영. strict 는 분리.

8. eval 의 격리

'use strict';
eval('var x = 1;');
console.log(x);     // ❌ ReferenceError (eval 내부 스코프)

sloppy 모드에서는 eval 안의 변수가 호출 스코프에 누설.

9. 미래 예약어 보호

implements, interface, let, package, private, protected, public, static, yield 가 식별자 금지.

언제 자동으로 strict 인가

  • ES module (.mjs, <script type="module">, modern build tools)
  • class 본문
  • export / import 사용 파일

따라서 현대 코드는 보통 자연스럽게 strict.

모범 사례

  1. 항상 'use strict' (또는 ES module 사용)
  2. 함수 단위 strict 는 옛 스타일, 파일 단위 권장
  3. 라이브러리 코드는 반드시 strict

호환성

모든 브라우저 + Node.js 가 지원. legacy IE5 같은 환경 외에는 문제 없음.

sloppy mode 의 함정 (왜 strict 가 필요한가)

// 1. global 오염
foo = 1;
function setup() {
    foo = 99;     // 의도와 다르게 global foo 변경
}

// 2. NaN 비교
NaN === NaN;     // false (이건 strict 무관)

// 3. with 의 스코프 폭주
with (obj) {
    a = 1;        // obj.a 인지 외부 a 인지 모호
}

strict 가 이런 함정의 상당수를 컴파일 / 런타임 에러로 잡아준다.

참고

이 글의 용어 (3개)
[Javascript] 스코프 체인javascript
정의 스코프 체인 (Scope Chain) 은 변수 식별자를 해결할 때 따라가는 중첩된 의 연결 구조. 안쪽 스코프에서 찾지 못한 변수를 바깥 스코프로 차례로 검색. 시각화 변수…
[Javascript] 호이스팅 (Hoisting)javascript
정의 호이스팅 (Hoisting) 은 JavaScript 엔진이 코드 실행 전에 선언을 스코프의 최상단으로 끌어올리는 동작. 단, / 는 로 접근 제한. var 의 호이스팅 엔진…
[Javascript] var / let / constjavascript
정의 JavaScript 의 3 가지 변수 선언 키워드. | 키워드 | 스코프 | 재할당 | 재선언 | 호이스팅 | |:---|:---|:---:|:---:|:---| | | f…

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기