본문 바로가기

개발/JavaScript

[Javascript] Strict mode

Strict mode 란?

기존에는 무시되는 에러들을 엄격히 표출하고 싶을때 사용한다.

 

간단한 예시로

v = "A strict mode script";
console.log(v) // A strict mode script
 

결과값이 잘 나오지만

"use strict";
v = "A strict mode script";
console.log(v) // Uncaught ReferenceError: v is not defined

strict mode를 사용하면 에러가 발생된다.

 

적용 방법

"use strict";
또는 
'use strict';
 

'use strict'; 작성시 엄격모드로 사용 할 수 있다.

전체 스크립트, 함수, 모듈에서 가능하다.

 

1. 스크립트에 strict mode 사용

"use strict";
v = "A strict mode script";
console.log(v) // Uncaught ReferenceError: v is not defined

2. 함수안에서 strict mode 사용

function fn() {
    "use strict";
    v = "A strict mode script";
    console.log(v) // Uncaught ReferenceError: v is not defined
}
fn();

3. 모듈안에서는 엄격모드가 디폴트로 적용된다.

 


strict mode의 적용 범위 

1. 기존에는 조용히 무시되던 에러등릉 Throwing 한다.
2. 엔진의 최적화 작업을 어렵게 만드는 실수를 바로잡는다. 가끔 비엄격 모드보다 빨리 작동한다.
3. 엄격모드는 상위 버전들에서 정의될 문법을 금지합니다.
 

1. 글로벌 변수, 선언하지 않은 변수에 접근시 에러 발생

"use strict";
global = 1; // Uncaught ReferenceError: global is not defined

 

2. 쓸 수 없는 프로퍼티에 할당

let undefined = 5;
let Infinity = 10;

console.log(undefined) // Uncaught SyntaxError: Identifier 'undefined' has already been declared
console.log(Infinity)

 

 3. 삭제할 수 없는 프로퍼티를 삭제하려 할때 

"use strict";
delete Object.prototype; // Uncaught TypeError: Cannot delete property 'prototype' of function Object() { [native code] }

 

4. 함수 파라미터명이 중복될때

"use strict";
function sum(a, a, c){ //Uncaught SyntaxError: Duplicate parameter name not allowed in this context

}

 

5. 8진 구문을 사용할 때

"use strict";
var sum = 015 + // !!! 구문 에러
          197 +
          142;
console.log(sum) // Uncaught SyntaxError: Octal literals are not allowed in strict mode.

주의

strict mode와 non-strict mode의 연결 주의하기

엄격모드 + 비엄격모드를 사용해야 한다면 함수 단위로 엄격모드를 사용하는 것이 좋다.

오류를 일으킬만한 동작들은 나중에 큰 문제를 가져올 수 있음을 명심하자.

 


Reference

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode