프로그래밍/JavaScript

[모딥다] JS (10) - strict mode

JellyApple 2024. 12. 26. 00:41

 

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 객체에 반영되지 않는다.