ECMAScript 5 엄격 한 모드

4883 단어 ECMAScript
ECMAScript 5 는 엄격 한 모드 (strict mode) 라 는 개념 을 도입 하여 IE10 + 가 지원 하기 시작 했다.엄격 한 모드 는 JavaScript 에 서로 다른 해석 과 실행 모델 을 정의 합 니 다. 엄격 한 모드 에서 ECMAScript 3 의 불확실 하거나 안전 하지 않 은 행 위 는 오 류 를 던 집 니 다.
엄격 한 모드 를 여 는 방법 은 '역할 영역' 의 첫 줄 에
'use strict';

엄격 한 모드 에서 var 정 의 를 사용 하지 않 은 전역 변 수 는 오 류 를 보고 합 니 다. 이것 은 현재 도 메 인 이 엄격 한 모드 인지 검증 하 는 간단 한 방법 입 니 다.
함수 급 역할 영역:
//     

(function foo() {

  'use strict';

  bar = 10; // ReferenceError

})();

스 크 립 트 레벨 역할 영역:
<script>

    //     

    'use strict';

    foo = 10; // ReferenceError

</script>

스 크 립 트 단계 의 엄격 한 모드 는 이 페이지 의 다른 스 크 립 트 에 영향 을 주지 않 습 니 다.
엄격 한 패턴 이 가 져 온 변화
엄격 한 모드 에서 ECMAScript 3 의 일부 '실수' 는 '오류' 를 던 지 는 동시에 문제 가 발생 하기 쉬 운 문법 을 제거 하여 디 버 깅 오 류 를 더욱 직접적 으로 만 들 었 다.
무의식중에 (var 를 사용 하지 않 음) 전역 변 수 를 만 드 는 것 이 잘못 되 었 습 니 다.
'use strict';



// Uncaught ReferenceError: 

// mistypedVariable is not defined 

mistypedVariable = 17;

중복 검사
'use strict';



// Uncaught SyntaxError: 

// Duplicate data property in object literal not allowed in strict mode 

var o = { p: 1, p: 2 }; 



// Uncaught SyntaxError: 

// Strict mode function may not have duplicate parameter names 

function sum(a, a, c){

    return a + b + c; 

}

함수 중의 this 키워드
엄격 한 모드 에서 함수 맨 위 에 있 는 this 는 window 가 아 닌 undefined 를 가리 킬 것 입 니 다.
'use strict';

function foo(){

    console.log(this) // undefined

}

foo();

변수 삭제 금지
'use strict';

var x;



// Uncaught SyntaxError:

// Delete of an unqualified identifier in strict mode. 

delete x;

8 진 글자 크기 정의 금지
'자 바스 크 립 트 고급 프로 그래 밍 (제3 판)' 에서 '8 진 글자 의 양은 엄격 한 모드 에서 무효 입 니 다.' 라 고 언급 한 작은 문제 가 있 습 니 다. 글자 의 양 이 무엇 입 니까?
You use literals to represent values in JavaScript. These are fixed values, not variables, that you literally provide in your script.
—— Values, variables, and literals
예 를 들 어 배열 의 글자 수 [], 예 를 들 어 대상 의 글자 수 {}, 그리고 정수 의 글자 수 는 다음 과 같은 세 가지 가 있다.
  • 0, 117 and -345 (decimal, base 10)
  • 015, 0001 and -077 (octal, base 8) 
  • 0x1123, 0x00111 and -0xF1A7 (hexadecimal, "hex" or base 16)

  • 그래서 이런 글자 의 양 적 표기 법 은 엄격 한 모델 에서 분명히 안 된다.
    'use strict';
    
    
    
    // Uncaught SyntaxError: 
    
    // Octal literals are not allowed in strict mode.
    
    var foo = 063; 

    책 에서 8 진 글자 의 양 이 통 하지 않 는 다 고 말 한 이상 호기심 은 나 로 하여 금 전체 글자 의 인용 유형 인 new Number (063) 를 시험 하 게 했다. 나의 인상 에서 그것 은 글자 의 양 과 차이 가 있다.
    console.log(typeof 1, typeof new Number(1)); // number object

    하지만
    'use strict';
    
    
    
    // Uncaught SyntaxError:
    
    // Octal literals are not allowed in strict mode
    
    var foo = new Number(063);

    따라서 엄격 한 모드 에서 글자 의 양 방식 과 인용 방식 이 표시 되 지 않 는 8 진 변 수 를 표시 합 니 다.
    with 문장 사용 금지
    with 문 구 를 사용 하면 예상 치 못 한 문 제 를 일 으 킬 수 있다. 예 를 들 어
    var root = {
    
        branch: {
    
            node: 1
    
        }
    
    };
    
     
    
    with(root.branch) {
    
        root.branch = {
    
            node: 0
    
        };
    
        //    1,   !
    
        alert(node);
    
    }
    
    //    0,   !
    
    alert(root.branch.node);

    그래서 엄격 한 모델 에서 with 문 구 를 제외 하고 동적 역할 영역 이 가 져 온 부정적인 효 과 를 없앤다.
    'use strict';
    
    
    
    // Uncaught SyntaxError: 
    
    // Strict mode code may not include a with statement
    
    with (obj){
    
        
    
    }

    eval 역할 영역
    마찬가지 로 eval 에서 변 수 를 설명 하 는 것 을 금지 하 는 것 도 엄격 한 모델 에서 정적 역할 영역 을 확보 하 는 것 이다.
    'use strict';
    
    eval('var foo = 2'); 
    
    
    
    // Uncaught ReferenceError:
    
    // bar is not defined 
    
    console.log(foo);

    함수 에서 caller, callee, arguments 에 접근 할 수 없습니다.
    function foo(){
    
      'use strict';
    
      foo.caller;    // TypeError
    
      foo.arguments; // TypeError
    
      arguments.callee; // TypeError
    
    }
    
    foo();

    스 크 립 트 나 함수 의 최상 위 에 함수 설명 을 해 야 합 니 다.
    'use strict';
    
    
    
    // Uncaught SyntaxError: 
    
    // In strict mode code, 
    
    // functions can only be declared at top level or
    
    //  immediately within another function. 
    
    if (true){
    
        function f1(){ }
    
        f1();
    
    }
    
    
    
    for (var i = 0; i &lt; 5; i++){
    
        function f2(){ } // SyntaxError
    
        f2();
    
    }

    보존 자 를 좀 늘리다
    엄격 한 모드 에서 일부 보존 자 를 추 가 했 습 니 다. implements, interface, let, package, private, proctected, Public, static, yield 는 이 단 어 를 변수 로 사용 하면 오 류 를 보고 할 수 있 습 니 다.
     
    결어: 엄격 한 모델 로 인해 자 바스 크 립 트 는 더욱 엄밀 하 게 표현 되 었 고 개발 자 들 이 역할 영역의 동적 결 과 를 분석 하 는 데 얽 매 이지 않 아 도 되 며 잠재 적 인 bug 로 인 한 이상 결 과 를 감소 시 켰 다.

    좋은 웹페이지 즐겨찾기