1. "use strict";
// strict 모드 적용
"use strict";
/* reference 에러가 발생하는 경우 */
a = 3; // reference error
/* type 에러가 발생하는 경우 */
// 1. 예약어에 대한 할당
let undefined = 5; // type error
let Infinity = 15; // type error
// 2. 쓰기 불가능하도록 지정된 속성에 대한 할당
let obj = {};
Object.defineProperty(obj, "val", { value: 7, writable: false });
obj.val = 3; // type error
// 3. setter가 정의 되지않은 속성에 대한 할당
let obj2 = {
get val() { return 7; }
};
obj2.val = 3; // type error
// 4. 확장 불가능한 객체에 속성 추가
let fixed_obj = {};
Object.preventExtensions(fixed_obj);
Object.defineProperty(fixed_obj, "val", {value: 7, writable: true}); // type error
// 5. 삭제 불가능한 속성에 대한 삭제시도
let obj3 = {};
Object.defineProperty(obj3, "val", { value: 7, configurable: false });
delete obj3["val"]; // type error
// 6. 원시(primitive) 값에 대한 프로퍼티 설정
(1).val = 11; // type error
false.val = 3; // type error
/* syntax 에러가 발생하는 경우 */
// 1. 중복되는 인자 이름(함수)
function func(a, a, b) { return a + b }; // syntax error
// 2. 8진구문 사용
// 8진법 구문은 사용할 일이 거의 없으며 실수가 발생하기 쉽기 때문에 구문오류로 처리
let a = 0o456; // syntax error
// 3. with 구문의 사용
// with 구문 사용시 블록안에서 사용되는 이름과 블록 바깥의 이름이 같아진다면
// 둘 중 어느것을 의미하는지 모호한 코드가 되기 때문에 strict모드에서는 with문 자체를 금지
let obj = {x: 15};
let x = 3;
with(obj) { // syntax error
console.log(x);
}
- "use strict"; 구문을 적어준 이후의 코드 실행에서는 strict 모드가 적용됨
- 원래라면 에러를 발생시키지 않았던 자잘한 오류들이 모두 에러를 발생시키도록 엄격한 문법이 적용됨
- strict 모드에서 에러를 발생시키도록 변경되는 사항들
- 선언되지 않은 변수의 참조
- 쓰기 불가능한 속성에 대한 할당
- Infinity, undefined 등 예약된 값
- 객체에서 writable: false로 정의된 속성값
- setter가 정의되지 않은 속성(getter-only)
- 확장 불가능하도록 지정된 객체에서 새 속성 할당
- 삭제 불가능한 속성에 대한 삭제시도
- 원시값에 대한 속성 설정 시도
- 모호한 구문의 사용 금지
- 함수 인자명 중복
- 8진수 구문
- with 구문
- 선언되지 않은 변수의 참조
- 위에 나열한 사항들 이외에도 많은 것들이 use strict에선 에러로 처리
2. 블록 strict모드
a = 3;
// func1 블록 내에서만 strict 모드 적용
function func1() {
"use strict";
b = 3;
}
func1(); // reference error 발생
- strict 모드의 적용은 보다 안전한 코드를 짜기 위해 도움이 되지만 유연함이 부족하며
다른 non-strict 모드 스크립트와의 결합시에도 문제가 발생할 여지가 있음 - 이를 해결하기 위해 부분적으로 strict 모드를 적용 가능
=> 블록 내에 "use strict"; 구문을 추가할경우 블록 내에서만 strict 모드가 적용
※ strict 모드를 기존에 non-strict 모드로 작성한 JavaScript 코드에 적용하는 것은
예상치 못한 에러를 대량으로 발생시킬 수 있기에 권장되지 않음. 처음 코드를
작성할 때부터 strict 모드를 적용시킨 후 이를 고려하여 작성해나가는 것이 바람직함
'언어 > JavaScript' 카테고리의 다른 글
#11 템플릿 리터럴(Template Literal) (0) | 2022.02.23 |
---|---|
#10 destructing (0) | 2022.02.23 |
#9 rest / spread 연산자 (0) | 2022.02.23 |
#8 import / export (0) | 2022.02.21 |
#7 클래스(Class) (0) | 2022.02.21 |