Fall in IT.

use strict(Strict Mode)란? 본문

프로그래밍언어/Javascript & Typescript

use strict(Strict Mode)란?

D.Y 2017. 12. 29. 10:29


안녕하세요.


오늘은 Javascript에서 사용되는 "use strict" 란 무엇인지 알아보도록 하겠습니다.



use strict란?

  • Strict Mode의 선언방식 입니다.
  • 이 문구는 ES5부터 적용되는 키워드로, 안전한 코딩을 위한 하나의 가이드라인 입니다.



Strict Mode란?

  • Strict Mode는 코드에 더 나은 오류 검사를 적용하는 방법입니다.
  • Strict Mode를 사용하면, 예를 들어 암시적으로 선언한 변수를 사용하거나 읽기 전용 속성에 값을 할당하거나 확장할 수 없는 개체에 속성을 추가할 수 없습니다.
  • Strict Mode는 ECMAScript 5 버전에 있는 새로운 기능으로써, 당신의 프로그램 또는 함수를 엄격한 운용 콘텍스트 안에서 실행시킬 수 있게끔 합니다. 이 엄격한 콘텍스트는 몇가지 액션들을 실행할 수 없도록 하며, 좀 더 많은 예외를 발생시킵니다.



Strict Mode의 장점

  • 흔히 발생하는 코딩 실수를 잡아내서 예외를 발생 시킵니다.
  • 상대적으로 안전하지 않은 액션이 발생하는 것을 방지합니다.
  • 정확하게 고려되지 않은 기능들을 비활성화 시킵니다.



실제 적용 예제코드

  • 전역 컨텍스트(함수 범위 밖)에서 선언되는 경우 프로그램의 모든 코드에 strict 모드가 적용됩니다.


  • 함수 내에서 선언되는 경우 함수의 모든 코드에 strict 모드가 적용됩니다.


  • MSDN의 내용을 복사한 자료 입니다. 더 자세한 내용은 링크를 참조 해주세요.

    언어 요소

    제한

    오류

    예제

    변수

    선언하지 않고 변수를 사용합니다.

    SCRIPT5042: Strict 모드에서 변수가 정의되지 않았습니다.

    testvar = 4;
    

    읽기 전용 속성

    읽기 전용 속성에 씁니다.

    SCRIPT5045: Strict 모드에서는 읽기 전용 속성에 할당할 수 없습니다.

    var testObj = Object.defineProperties({}, {
        prop1: {
            value: 10,
            writable: false // by default
        },
        prop2: {
            get: function () {
            }
        }
    });
    testObj.prop1 = 20; 
    testObj.prop2 = 30;
    

    확장할 수 없는 속성

    extensible 특성이 false로 설정된 개체에 속성을 추가합니다.

    SCRIPT5046: 확장할 수 없는 개체의 속성을 만들 수 없습니다.

    var testObj = new Object();
    
    Object.preventExtensions(testObj);
    
    testObj.name = "Bob";
    
    

    delete

    변수, 함수 또는 인수를 삭제합니다.

    configurable 특성이 false로 설정된 속성을 삭제합니다.

    SCRIPT1045: strict 모드에서는 <식>에 대해 delete를 호출할 수 없습니다.

    var testvar = 15;
    function testFunc() {};
    delete testvar;
    delete testFunc;
    
    Object.defineProperty(testObj, "testvar", {
        value: 10,
        configurable: false
        });
    delete testObj.testvar;
    

    속성 중복

    개체 리터럴에서 속성을 두 번 이상 정의합니다.

    SCRIPT1046: strict 모드에서는 한 속성을 여러 번 정의할 수 없습니다.

    var testObj = {
        prop1: 10,
        prop2: 15,
        prop1: 20
    };
    
    
    

    매개 변수 이름 중복

    함수에서 매개 변수 이름을 두 번 이상 사용합니다.

    SCRIPT1038: strict 모드에서는 정식 매개 변수 이름이 중복될 수 없습니다.

    function testFunc(param1, param1) {
        return 1;
    };
    

    다음에 사용하기 위한 예약된 키워드

    다음에 사용하기 위한 예약된 키워드를 변수 또는 함수 이름으로 사용합니다.

    SCRIPT1050: 식별자에 대해 다음에 사용하기 위한 예약어를 잘못 사용했습니다.strict 모드에서는 식별자 이름이 예약됩니다.

    • implements

    • interface

    • package

    • private

    • protected

    • public

    • static

    • yield

    8진수

    숫자 리터럴에 8진수 값을 할당하거나 8진수 값에 이스케이프를 사용하려고 합니다.

    SCRIPT1039: strict 모드에서는 8진수 숫자 리터럴 및 이스케이프 문자를 사용할 수 없습니다.

    var testoctal = 010;
    var testescape = \010;
    

    this

    this의 값이 null또는 undefined인 경우 전역 개체로 변환되지 않습니다.

    function testFunc() {
        return this;
    }
    var testvar = testFunc();
    
    

    strict 모드가 아닌 경우 testvar 값은 전역 개체이지만 strict 모드에서 이 값은 undefined입니다.

    식별자인 eval

    문자열 "eval"은 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.

    var eval = 10;
    

    문 또는 블록 내에서 선언된 함수

    문 또는 블록 내에서 함수를 선언할 수 없습니다.

    SCRIPT1047: strict 모드에서는 함수 선언을 문이나 블록 내에 중첩할 수 없습니다.함수 선언은 함수 본문 내에 직접 나오거나 최상위 수준에만 나와야 합니다.

    var arr = [1, 2, 3, 4, 5];
    var index = null;
    for (index in arr) {
        function myFunc() {};
    }
    

    eval 함수 내에서 선언된 변수

    변수가 eval 함수 내에서 선언되는 경우 해당 함수 밖에서 사용할 수 없습니다.

    SCRIPT1041: strict 모드에서 'eval'을 잘못 사용했습니다.

    eval("var testvar = 10");
    testvar = 15;
    

    간접 계산이 가능하지만 eval 함수 외부에 선언된 변수는 여전히 사용할 수 없습니다.

    var indirectEval = eval;
    indirectEval("var testvar = 10;");
    document.write(testVar);
    

    이 코드는 "SCRIPT5009: 'testVar'이 정의되지 않았습니다" 오류를 발생시킵니다.

    식별자인 Arguments

    문자열 "arguments"는 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.

    SCRIPT1042: strict 모드에서 'arguments'를 잘못 사용했습니다.

    var arguments = 10;
    

    함수 내 arguments

    로컬 arguments개체의 멤버 값을 변경할 수 없습니다.

    function testArgs(oneArg) {
        arguments[0] = 20;
    }
    

    strict 모드가 아닌 경우 arguments[0] 값을 변경하여 oneArg 매개 변수의 값을 변경할 수 있습니다. 그러면 oneArg 및 arguments[0]의 값이 모두 20이 됩니다.strict 모드에서 arguments[0] 값을 변경해도 oneArg 값에 영향을 주지 않습니다. arguments 개체가 로컬 복사본이기 때문입니다.

    arguments.callee

    허용되지 않습니다.

    function (testInt) {
        if (testInt-- == 0)
            return;
        arguments.callee(testInt--);
    }
    

    WITH

    허용되지 않습니다.

    SCRIPT1037: strict 모드에서는 'with' 문을 사용할 수 없습니다.

    with (Math){
        x = cos(3);
        y = tan(7);
    }


그렇다면, ES6에서는 Strict Mode가 필요할까?



참고


Comments