ECMAScript use strict 사용하기

“use strict” 은 자바스크립트 코드를 좀 더 엄격한(strict) 모드에서 실행하도록 인터프리터에게 명령하는 자바스크립트의 지시자(directive)다.

좋은 점 3가지

  1. 코딩 실수 대신 에러를 낸다. 따라서 프로그래머는 자신의 실수를 쉽게 알아차릴 수 있다.
  2. 보통 엄격 모드에서 실행속도가 빠르다라고 알려져 있다. 직접 테스트를 안해봐서 알 수는 없지만, 엄격 모드에서는 인터프리터의 최적화 작업을 어렵게 만드는 문법을 금지시키기 때문에 빠르다.
  3. ECMAScript의 차기 버전들에서 정의 될 문법을 사용하지 못한다.

‘엄격 모드’를 사용하면 생기는 제한

이 ‘엄격 모드’로 자바스크립트 코드를 실행하고자 하면 은은하게 많은 제한이 생긴다. 주석은 크롬 콘솔에서 실행했을 때 발생하는 에러다.

  1. 생성하지 않은 변수를 사용할 수 없다. 자바스크립트에서는 실수로 변수명을 잘못 적었다면 에러를 내지 않고 그냥 새로운 전역 변수가 생성되는데, strict 모드를 사용하면 이를 막을 수 있다.

    1
    2
    "use strict";
    pi = 3.1415; // Uncaught ReferenceError: pi is not defined
  2. 변수나 함수, 삭제할 수 없는 속성을 삭제할 수 없다.

    1
    2
    3
    4
    5
    6
    "use strict";
    var pi = 3.14;
    delete pi;
    function f(p1, p2) {};
    delete f; // Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.
    delete Object.prototype; // TypeError: property "prototype" is non-configurable and can't be deleted
  3. 파라미터 이름을 중복으로 쓸 수 없다.

    1
    2
    "use strict";
    function f(p1, p1) {}; // SyntaxError: duplicate formal argument p1
  4. 8진수 리터럴, 8진수 이스케이프 문자를 사용할 수 없다.

    1
    2
    3
    "use strict";
    var oct = 010; // Uncaught SyntaxError: Octal literals are not allowed in strict mode
    var oct1 = "\010"; // Uncaught SyntaxError: Octal escape sequences are not allowed in strict mode.
  5. 읽기 전용 속성이나 GET 전용 속성을 다시 쓸 수 없다.

    1
    2
    3
    4
    5
    6
    "use strict";
    var obj = {get z() {return 0} };
    Object.defineProperty(obj, "x1", {value:123, writable:false});

    obj.x1 = "hello"; // Uncaught TypeError: Cannot assign to read only property 'x1' of object
    obj.z = "world"; // Uncaught TypeError: Cannot set property z of #<Object> which has only a getter
  6. 몇 가지 키워드를 변수명으로 사용할 수 없다.

    1
    2
    3
    "use strict";
    var eval = 'hello'; // SyntaxError: 'eval' can't be defined or assigned to in strict mode code
    var arguments = 'world'; // SyntaxError: 'arguments' can't be defined or assigned to in strict mode code

브라우저 지원

2009년 ECMAScript 5에서 처음 나온 기능으로 IE9과 그 이전 IE에서는 strict 모드를 지원하지 않는다. 다만 이전 브라우져에서 큰 문제는 되지 않는데, 이전 브라우져에서는 문법적(BNF)으로 보면 “use strict”를 그저 리터럴 표현으로 인식하기 때문에 side effect 를 발생시키지 않고 따라서 그냥 무시될 뿐이다.

strict 모드를 지원하는 브라우져는 아래와 같다.

  • 크롬 버전 10 이상
  • 파이어폭스 버전 4 이상
  • 사파리 버전 5.1 이상
  • IE 버전 10 이상
공유하기 댓글