ecoEarth 2023. 7. 31. 00:04

Overview

  • strict mode란?
  • strict mode의 적용
  • 전역에 strict mode를 적용하는 것은 피하자
  • 함수 단위로 strict mode를 적용하는 것도 피하자
  • strict mode가 발생시키는 에러
  • strict mode 적용에 의한 변화

 

strict mode란?

function foo() {
 x = 10;
}
foo();
console.log(x); // ?

스코프를 배웠다면, 당연히 에러가 날것이라고 예상했겠지만 위의 코드출력값은 놀랍게도 10이다. 

변수 선언이 없는 할당이므로 함수의 스코프에 존지하지 않고, 스코프체이닝에 의해 전역 스코프를 찾아봐도 존재하지 않는다. 따라서 위의 코드는 에러를 발생시킬 것 가지만 놀랍게도 10이 출력된다. 이는 자바스크립트 엔진이 암묵적으로 전역 객체에 x 프로퍼티를 동적을 생성하기때문이고, 이를 암묵적 전역이라 한다. 이렇게 오타나 문법 지식의 미비로 인산 실수는 언제나 발생한다. 따라서 잠재적인 오류를 발생시키기 어려운 개발 환경을 만들고 그 환경에서 개발하는 것이 좀 더 근본적인 해결책이라고 할 수 있다.

  • 이러한 환경을 지원하기 위해 ES5부터 strict mode가 추가되었다. 

 

strict mode의 적용

'use strict';
function foo() {
 x = 10; // ReferenceError: x is not defined
}
foo();
  • strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 'use strict';를 추가한다.
  • 전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용된다.

 

전역에 strict mode를 적용하는 것은 피하자

  • 스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지 않고 해당 스크립트에 한정되어 적용된다.
  • 하지만 strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다.
  • 특히 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있기 때문에 전역에 strict mode를 적용하는 것은 바람직하지 않다

 

함수 단위로 strict mode를 적용하는 것도 피하자

// 즉시 실행 함수의 선두에 strict mode 적용
(function () {
    'use strict';
    console.log(3);
}());
  • 함수 단위로 strict mode를 적용할 수도 있다. 그러나 어떤 함수는 strict mode를 적용하고 어떤 함수는 strict mode를 적용하지 않는 것은 바람직하지 않으며 모든 함수에 일일이 strict mode를 적용하는 것은 번거로운 일이다.
  • strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 이 또한 문제가 발생할 수 있다.
  • 따라서 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.

 

strict mode가 발생시키는 에러

  • 암묵적 전역
  • 변수, 함수, 매개변수의 삭제
  • 매개변수 이름의 중복
  • with문의 사용

 

strict mode 적용에 의한 변화

  • 일반 함수의 this
    • strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다. 생성자 함수가 아닌 일반 
      함수 내부에서는 this를 사용할 필요가 없기 때문이다. 이때 에러는 발생하지 않는다.
  • arguments 객체
    • strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.