stric mode는 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킴
{}
괄호로 묶여진 블럭문에는 적용되지 않음// Whole-script strict mode syntax
"use strict";
const v = "Hi! I'm a strict mode script!";
function myStrictFunction() {
// Function-level strict mode syntax
"use strict";
function nested() {
return "And so am I!";
}
return `Hi! I'm a strict mode function! ${nested()}`;
}
function myNotStrictFunction() {
return "I'm not strict.";
}
function sum(a = 1, b = 2) {
// SyntaxError: "use strict" not allowed in function with default parameter
"use strict";
return a + b;
}
function myStrictFunction() {
// because this is a module, I'm strict by default
}
export default myStrictFunction;
🧐모듈의 모든 내용이 자동으로 strict mode 적용을 받는데 그동안 rest parameter, default 등은 어떻게 사용이 가능 했지?
🗝️"use strict" 지시문이 함수의 본문에 직접 쓸 때나 일반 스크립트에서 쓸 때는, 간단한 매개변수를 가진 함수에만 적용되는 제한이 있습니다. 이는 "use strict" 지시문을 직접 쓰는 방식이 원래 오래된 코드에 대한 하위 호환성을 유지하기 위해 설계되었기 때문입니다. 이런 오래된 코드에서는 기본값, 나머지, 구조 분해 등의 고급 매개변수 기능을 지원하지 않았습니다.
그러나 모듈에서는 이런 제한이 없습니다. 모듈은 자바스크립트의 최신 기능을 전부 활용하도록 설계되었기 때문에, 기본값, 나머지, 구조 분해 등의 고급 매개변수 기능을 사용해도 문제가 없습니다. 이는 모듈이 자체적으로 strict mode를 적용하기 때문에 이런 복잡한 매개변수를 정상적으로 처리할 수 있기 때문입니다.
class C1 {
// All code here is evaluated in strict mode
test() {
delete Object.prototype;
}
}
new C1().test(); // TypeError, because test() is in strict mode
const C2 = class {
// All code here is evaluated in strict mode
};
// Code here may not be in strict mode
delete Object.prototype; // Will not throw error
🗝️JavaScript의 strict mode와 React의 strict mode는 다른 개념입니다.
JavaScript의 strict mode는 위에서 설명드린 것처럼, JavaScript 코드의 문법을 보다 엄격하게 검사하여 일반적으로 발생할 수 있는 오류를 미연에 방지하거나 잠재적인 문제를 미리 알려주는 역할을 합니다.
반면에, React의 strict mode는 React 컴포넌트의 라이프사이클을 보다 엄격하게 관리하기 위한 도구입니다. React.StrictMode는 개발 모드에서만 활성화되며, 그 자식 컴포넌트들에 대해 추가적인 검사와 경고를 활성화시킵니다. 이는 주로 레거시 API의 사용을 찾아내거나 예상치 못한 부작용(side effects), 불필요한 렌더링 등을 감지하는 데 도움이 됩니다.
따라서 JavaScript의 strict mode는 문법적인 오류를 잡아내는 데 초점을 두는 반면, React의 strict mode는 애플리케이션의 성능 최적화와 더 나은 컴포넌트 설계에 도움을 주는 것이 목표입니다.