ECMAScript5에서 소개된 JavaScript의 strict mode는 JavaScript의 제한된 버전을 선택하여 암묵적인 느슨한 모드(sloppy mode)를 해제하기 위한 방법이다.
기존에 무시되던 에러들을 발생시키며, 더 빨리 작동하도록 만들어준다.
x = 10
느슨한 모드에서는 var x = 10으로 동작
------------------------------------
"use strict"
x = 10 // ReferenceError발생
"use strict";
undefined = 5;
NaN = 10;
Infinity = 100;
const obj1 = {};
Object.defineProperty(obj1, "x", { value: 42, writable: false });
obj1.x = 9;
const obj2 = {
get x() {
return 10;
},
};
const fixed = {};
Object.preventExtensions(fixed);
fixed.newProp = "ohai";
//readonly변수(혹은 property), getter only property들의 값을 할당하는 작업,
확장 불가 객체에 새 property를 할당하는 작업에서 오류를 발생시켜준다.
"use strict";
delete Object.prototype;
// TypeError: Cannot delete property
// "use strict";
function sum(a, a, c) {
console.log(a, c);
console.log(arguments);
}
sum(1, 2, 3, 4, 5);
// SyntaxError: Duplicate parameter name not allowed in this context
느슨한 모드에서는 중복된 파라미터의 이전 인수들을 숨기지만 arguments에는 남아있음
"use strict";
const a = 015;
// SyntaxError: Octal literals are not allowed in strict mode.
느슨한 모드에서는 8진수로 표현되지만, 엄격모드에서 진수를 표현하고 싶은 경우는
0+진수문자 사용(2진수b, 8진수o, 16진수x)
"use strict";
const a = 100;
a.c = 10;
// TypeError: Cannot create property
"use strict";
function sum(a, b) {
a = 100;
console.log(a + b);
console.log(arguments[0] + arguments[1]);
}
sum(1, 2);
느슨한 모드에서는 parameter를 변경하면 arguments값도 바뀌어 둘 다
102가 출력되지만, 엄격 모드에서는 arguments의 값은 바뀌지 않기 때문에
102, 3이 출력된다.
"use strict"
console.log(ff, f);
{
f();
var x = 2;
function f() {
console.log("f>", x);
}
f();
}
function ff() {
console.log("ff>", y);
}
위의 상황에서 hoisting시 느슨한 모드에서는 function f가 전역에 undefined로 등록되기 때문에 맨 윗줄 console.log는 ([Function: ff] undefined)를 출력하지만, 엄격 모드에서는 function f는 block scope이기 때문에 console.log에서 ReferenceError가 발생한다.
전체 script에 적용하기 위해 구문 작성 전 "use strict"를 삽입한다.
"use strict"
const a = 'Hello';
const b = 'strict mode';
console.log(a + b)
또는 특정 함수에 적용하기 위해 함수 본문 처음에 구문을 삽입해준다.
function strict(){
"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";
}
위에서 strict함수는 엄격모드지만, notStrict함수는 느슨한 모드이다.
마지막으로 module을 적용하는것이다.
package.json의 type을 module로 주면 자동으로 엄격모드로 변경된다.
package.json
{
...
...
"type": "module",
...
...
}