1. 암묵적 전역
: 변수의 선언이 존재하지 않지만 자바스크립트 엔진이 암묵적으로 전역 객체에 프로퍼티를 동적 생성하는 것
: 아래처럼 x는 선언되지 않았기 때문에 foo 스코프를 넘어 전역 스코프로 넘어갔을 때도 x 변수는 선언이 되지 않아 Referrence Error가 떠야할 것 같지만 그렇지 않고 전역객체에 암묵적으로 x 프로퍼티를 동적 생성함.
: 그래서 꼭 var , let ,const 키워드를 사용하여 변수를 선언한 다음 사용해야 한다.
function foo() {
x = 10;
}
foo();
console.log(x);
2. strict mode
: 그럼에도 불구하고 오타나 문법 지식의 미비로 인한 실수는 발생하기 때문에 이러한 오류를 발생시키지 않기 위한 환경을 만드는 것이 중요하다.
: ES5부터 위를 해결하기 위해 strict mode (엄격모드)가 추가되었음.
: 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생 시킨다.
: ESLint 같은 린트 도구를 사용해도 유사한 효과를 얻을 수 있음
* 린트 도구 : 정적 분석 기능을 통해 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적 오류만이 아니라 잠재적 오류까지 찾아내고 오류의 원인을 리포팅해주는 유용한 도구.
3. strict mode 적용
: 전역의 선두 또는 함수 몸체의 선두에 'use strict';를 추가한다.
'use strict';
function foo() {
x = 10; // ReferenceError : x is not defined
}
foo();
4. strict mode 주의사항
1) 전역에 strict mode 적용은 지양해야한다.
: 전역에 적용한 strict mode는 스크립트 단위로 적용된다.
: 스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지 않고 해당 스크립트에 한정되어 적용됨
: 그러나 strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다. (특히 외부 서드파티 라이브러리 사용 시)
2) 함수 단위로 strict mode 적용도 피해야 한다.
: strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 이 또한 문제가 될 수 있다.
5. strict mode가 발생시키는 에러
1) 암묵적 전역
: 선언하지 않은 변수를 참조하면 ReferrenctError가 발생함
2) 변수, 함수, 매개변수의 삭제
: delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생함.
3) 매개변수 이름의 중복
: 중복된 매개변수 이름을 사용하면 SyntaxError가 발생함
4) with문의 사용
: with문을 사용하면 SyntaxError가 발생함
: with문은 전달된 객체를 스코프체인에 추가한다.
: with문은 사용하지 않아야 한다.
6. strict mode 적용에 의한 변화
1) 일반 함수의 this
: strict mode에서 함수를 일반 함수로서 호출하면 this에 undefind가 바인딩 됨.
: 생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다.
2) arguments 객체
: strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.
'프로그래밍 > JavaScript' 카테고리의 다른 글
[모딥다] JS (12) - this (0) | 2025.01.04 |
---|---|
[모딥다] JS (11) - 빌트인 객체 (0) | 2025.01.03 |
[모딥다] JS (9) - 프로토타입 (0) | 2024.12.24 |
[모딥다] JS (8) - 함수와 일급객체 (0) | 2024.12.22 |
[모딥다] JS (7) - 생성자 함수에 의한 객체 생성 (0) | 2024.12.20 |