Strict mode란?
function foo() {
x = 10;
}
foo();
console.log(x); //10
이때 자바스크립트 엔진에 암묵적으로 전역 객체에 x 프로퍼티를 동적 생성한다. 전역 객체의 x 프로퍼티는 마치 전역 변수처럼 사용할 수 있는데 이를 암묵적 전역이라고 함.
암묵적 전역은 오류를 발생시킬 수 있음.
이러한 이유외에도 오타나 지식 미비로 인한 실수를 막기 위한 ES5부터 추가된 모드가 strict mode
Es lint 같은거 써도 유사한 효과 얻을 수 있음
Strict mode의 적용
strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 'use strict'; 를 추가함.
"use strict";
function foo() {
x = 10; //ReferenceError: x is not defined
}
foo();
function foo() {
x = 10; // 에러 안뜸
("use strict");
}
foo();
function foo2() {
"use strict";
y = 10; // ReferenceError: y is not defined
}
foo2();
전역에 strict mode를 적용하는 것은 피하자
라이브러리가 non-strict mode인 경우도 있기 때문에..
함수 단위에 strict mode를 적용하는 것은 피하자
strict mode가 적용된 함수가 참조할 함수 오부의 컨텍스트에 strict mode를 적용하지 않는 다면 문제가 생길 수 있고, 일일이 strict mode를 적용하는 건 번거로움. 따라서 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는게 바람직함
strict mode가 발생시키는 에러
1. 암묵적 전역
선언하지 않은 변수를 참조하면 ReferenceError 발생
2. 변수 , 함수, 매개변수의 삭제,
delete 연산자로 변수, 함수 ,매개변수를 삭제하면 SyntaxError 발생
3. 매개변수의 이름 중복
중복된 매개변수의 이름을 사용하면 SyntaxError
4. with 문의 사용
with 문을 사용하면 SyntaxError 발생. with 문은 전달된 객체를 스코프 체인에 추가함. with문은 비사용 추천
strict mode에 적용에 의한 변화
1. 일반 함수의 this
strict mode에서 함수를 일반함수로서 호출하면 .this에 undefined가 바인딩됨(에러는 x)
2. arguments 객체
strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않음.
(function (a) {
"use strict";
//매개변수에 전달된 인수를 재할당하여 변경
a = 2;
// 변경된 인수가 arguments 객체에 반영되지 않음
console.log(arguments); // {0; 1, length :1} //[Arguments] { '0': 1 }
})(1);'강의 노트 > JS' 카테고리의 다른 글
| [JS deep dive] 23장 실행 컨텐스트 (0) | 2023.04.07 |
|---|---|
| [JS deep dive] 빌트인 객체 (0) | 2023.04.05 |
| [JS deep dive] 프로토타입 (2) (0) | 2023.04.03 |
| [JS deep dive] 프로토타입(1) (0) | 2023.04.02 |
| [JS deep dive] this (0) | 2023.04.01 |