Published on

strict mode

엄격 모드

장점

  • 자바스크립트 언어의 문법을 좀 더 엄격하게 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생시킴

단점(strict mode가 발생시키는 에러)

암묵적 전역

(function () {
  'use strict';

  x = 1;
  console.log(x); // ReferenceError: x is not defined
}());
  • 선언하지 않은 변수를 참조하면 ReferenceError: x is not defined 에러 발생

변수, 함수, 매개변수의 삭제

(function () {
  'use strict';

  var x = 1;
  delete x; // SyntaxError: Delete of an unqualified identifier in strict mode.

  function foo(a) {
    delete a; // SyntaxError: Delete of an unqualified identifier in strict mode
  }

  delete foo; // SyntaxError: Delete of an unqualified identifier in strict mode
}());
  • delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생

매개변수 이름의 중복

(function () {
  'use strict';

  // SyntaxError: Duplicate parameter name not allowed in this context
  function foo(x, x) {
    return x + x;
  }

  console.log(foo(1, 2));
}());
  • 중복된 매개변수 이름을 사용하면 SyntaxError가 발생함

전역 strict mode 사용 시

  • strict modenon-strict mode의 혼용 하는 경우 오류 발생의 위험이 있음
  • 특히, 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있기 때문에 전역 strict mode 적용 시 오류를 발생시킬 수 있음
  • 해결
    • 즉시 실행 함수로 스크립트 전체를 감싸서 스코프를 구분하고 즉시 실행 함수의 선두에 strict mode를 적용

      // 즉시 실행 함수의 선두에 strict mode 사용
      (function(){
      	'use strict';
      
      	// Do something...
      }());
      

브라우저 콘솔에서 사용하기

  • 기본적으로 use strict가 적용되지 않는다는 점에 주의해야 함
'use strict'; // <Shift+Enter를 눌러 줄바꿈>
// 테스트 코드 입력
// <Enter 눌러 실행>
(function(){
  'use strict';

  // 테스트 코드 입력
}());

꼭 사용해야 하는가?

  • 모던 자바스크립트는 ES6에 도입된 클래스모듈이라는 구조를 제공하므로 엄격모드(use strict)가 자동으로 적용됨

Referenced