일반 JavaScript를 사용할 경우 존재하지 않는 속성이나 객체, 변수, 쓰기 불가능한 값 등에 실수로 값을 할당하면 오류를 발생시키지 않고 새로운 전역 변수가 생성됩니다.
use strict
를 선언하여 엄격 모드를 사용하면 오류가 발생하여 실수로 전역 변수를 생성하는 것이 불가능해지며 더 안정적인 코드를 작성할 수 있습니다.
"use strict";
x = 3.14; // 일반 Javascript에서는 전역 변수 생성, 엄격 모드에서는 오류가 발생
엄격 모드는 'use strict';
구문을 다른 코드를 작성 전에 선언하여 적용이 가능하며,
전체 스크립트 또는 함수 단위(eval
, function
, 이벤트 핸들러
)로 적용이 가능합니다.
// 전체 스크립트 엄격 모드 구문
"use strict";
var v = "Hi! I'm a strict mode script!";
// 함수 단위 엄격 모드 적용
function strict() {
// 함수-레벨 strict mode 문법
"use strict";
function nested() {
return "And so am I!";
}
return "Hi! I'm a strict mode function! " + nested();
}
function notStrict() {
return "I'm not strict.";
}
JavaScript 모듈의 경우, use strict
를 명시해 주지 않아도 자동으로 엄격 모드가 적용됩니다.
function strict() {
// 모듈의 경우, use strict를 선언해 주지 않아도 엄격 모드 적용
}
export default strict;
오탈자 등의 실수로 글로벌 변수 및 객체를 생성하는 것을 불가능하게 합니다.
"use strict";
// 전역 변수 mistypedVariable 이 존재한다고 가정
mistypedVaraible = 17; // 변수의 오타때문에 이 라인에서 ReferenceError 를 발생시킴
x = {p1:10, p2:20}; // ReferenceError
NaN
, undefined
등 특정 의미를 가지고 있는 전역 변수에 값을 할당하려고 하거나 확장 불가능한 객체에 새 프로퍼티를 할당하는 것이 불가능해집니다.
"use strict";
// 쓸 수 없는 프로퍼티에 할당
var undefined = 5; // TypeError 발생
var Infinity = 5; // TypeError 발생
// 쓸 수 없는 프로퍼티에 할당
var obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9; // TypeError 발생
// getter-only 프로퍼티에 할당
var obj2 = {
get x() {
return 17;
},
};
obj2.x = 5; // TypeError 발생
// 확장 불가 객체에 새 프로퍼티 할당
var fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai"; // TypeError 발생
"use strict";
let x = 3.14;
delete x; // Error
function y(p1, p2) {};
delete y; // Error
function sum(a, a, c) {
// 매개변수 'a' 가 중복으로 선언되어 있음, 구문 에러
"use strict";
return a + b + c;
}
숫자 앞에 '0'을 붙여 사용하는 8진 구문을 금지합니다.
"use strict";
var sum =
015 + // 구문 에러
197 +
142;
string, number, boolean 등 객체가 아니면서 메서드 또는 속성도 가지지 않는 데이터에 프로퍼티를 할당하는 것이 불가능해집니다.
(function () {
"use strict";
false.true = ""; // TypeError
(14).sailing = "home"; // TypeError
"with".you = "far away"; // TypeError
})();
객체를 명시하지 않고 프로퍼티와 메서드를 참조하는 with
구문을 사용하지 못하게 합니다.
"use strict";
with (Math) { // 구문 에러
// Math를 기본 객체로 지정하여 프로퍼티, 메서드 참조
a = PI * r * r;
x = r * cos(PI);
y = r * sin(PI / 2);
}
보안상의 이유로 eval()
이 호출된 범위 내에서 변수 생성이 불가능해집니다.
"use strict";
eval ("x = 2");
alert (x); // Error
eval ("var x = 2"); // 엄격 모드에서는 eval() 이 var, let 키워드를 사용하여 변수 생성 불가능
alert (x);
다음 자바스크립트 버전에서 예약어로 쓰이는 단어들은 엄격 모드에서 변수 이름으로 사용할 수 없습니다.
this
키워드는 함수를 호출한 객체를 참조합니다. 객체가 지정되지 않았을 경우 일반 모드의 함수는 전역 객체인 window
를 반환하지만, 엄격 모드에서는 undefined
를 반환합니다.
"use strict";
function myFunction() {
alert(this); // "undefined" 가 출력됨
}
myFunction(); // 객체 안에서 myFunction 을 호출하지 않음