
자바스크립트는 오랫동안 호환성 이슈가 없었다. 기존의 기능을 변경하지 않으면서 기능이 추가되었기 때문이다. 덕분에 기존에 작성한 코드는 절대 망가지지 않는 장점이 있었다.
이런 상황은 ECMAScript(ES5)가 등장하기 전인 2009년까지 지속되었다. 그런데, 새롭게 제정된 ES5에서는 새로운 기능이 추가되고 기존 기능 중 일부가 변경되었다.
앞에서 말했듯이 기존 기능을 변경되지 않았기 때문에 호환성 이슈가 없었지만, 기능이 추가되면서 호환성에 문제가 생긴 것이다. 그래서 대부분은 ES5의 기본 모드에선 활성화되지 않도록 설계되었다. 대신에 use strict라는 특별한 지시자를 사용해 Strict Mode를 활성화 했을 때만 변경 사항이 활성화되게 해놓았다.
한 마디로 말하면 엄격하게 문법 검사를 하겠다는 뜻이다.
지시자 "use strict"혹은 'use strict'는 단순한 문자열처럼 생겼지만, 이 지시자가 스크립트 최상단에 오면 스크립트 전체가 모던한 방식(strict 모드)으로 동작한다!
꼭 최상단에 오는 것이 아닌, 함수 내부에 사용해서 해당 함수에만 strict mode로 실행시킬 수 있다. 하지만, 'use strict'를 취소할 방법은 없다. 자바스크립트 엔진을 이전으로 되돌리는 지시자는 존재하지 않고 엄격 모드가 적용되면 돌이킬 방법이 없다.
name = "kks";
console.log(name);
일반적인 JS 환경에서는 name 변수를 명시적으로 선언하지 않았는데 전역 변수로 만들어져 동작할 수 있다. 하지만 이렇게 되면 의도치 않은 오류가 발생할 수 있다.
여기서 strict mode를 적용한다면?
"use strict"
name = "고성" // ReferenceError 발생!
변수를 선언하지 않고 사용했기 때문에 ReferenceError 오류가 발생한다. 오류를 방지하기 위해서는 let, const와 같은 변수 선언 명령어를 작성해야 한다.
const user = {};
Object.defineProperty(user, "name", {
value: "kks",
writable: false
});
user.name = "철수";
일반 모드에서는 할당이 실패하더라도 오류 없이 넘어갈 수 있지만, strict 모드가 적용된다면 TypeError가 발생한다.
"use strict";
const user = {
name: "kks"
};
// 엄격 모드에서는 사용할 수 없음
with (user) {
console.log(name);
}
위 코드에서는 SyntaxError가 발생하는데, 이유는 with문은 name이 현재 함수의 변수인지 혹은 user.name인지 파악하기 어렵게 만들기 때문에 strict mode에서는 금지된다. 그렇기 때문에 console.log(user.name);와 같이 명확히 작성해야 한다.
//user.js
export const userName = "kks";
이런 모듈 코드는 "use strict";를 별도로 작성하지 않아도 자동으로 strict mode로 실행된다. 따라서, 모듈 환경에서는 strict mode를 적용하기 위해 매번 지시문을 작성할 필요가 없다.
"무조건 사용해야 하겠네"라고 생각하지만, 그렇지만은 않다. 바로 JS가 발전하면서 Class와 Module을 사용하는 코드에는 strict mode가 자동으로 적용되도록 바뀌었다.
한 문장으로 요약하면, 예전에는 개발자가 직접 켜야 했지만 현대 JavaScript에서는 모듈이나 클래스를 사용하면 자동으로 켜지기 때문에 꼭 직접 작성할 필요는 없다는 뜻이다.


과거에는 일반 스크립트에서 strict mode를 사용하기 위해 "use strict"를 직접 작성해야 했지만, ES6부터 도입된 모듈과 클래스에서는 자동으로 엄격 모드가 적용된다. 따라서 현대적인 JavaScript 개발 환경에서는 직접 작성하지 않아도 되는 경우가 많다.
결론적으로, "use strict"를 반드시 작성해야 하는 것은 아니지만, strict mode의 목적과 동작 방식을 이해하는 것은 중요하다. 특히 변수 선언 규칙, this 바인딩, 오류 처리 등의 차이를 이해하면 보다 안정적이고 명확한 JavaScript 코드를 작성하는 데 도움이 된다.