ECMAScript 5 엄격 한 모드
4883 단어 ECMAScript
엄격 한 모드 를 여 는 방법 은 '역할 영역' 의 첫 줄 에
'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
예 를 들 어 배열 의 글자 수 [], 예 를 들 어 대상 의 글자 수 {}, 그리고 정수 의 글자 수 는 다음 과 같은 세 가지 가 있다.
그래서 이런 글자 의 양 적 표기 법 은 엄격 한 모델 에서 분명히 안 된다.
'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 < 5; i++){
function f2(){ } // SyntaxError
f2();
}
보존 자 를 좀 늘리다
엄격 한 모드 에서 일부 보존 자 를 추 가 했 습 니 다. implements, interface, let, package, private, proctected, Public, static, yield 는 이 단 어 를 변수 로 사용 하면 오 류 를 보고 할 수 있 습 니 다.
결어: 엄격 한 모델 로 인해 자 바스 크 립 트 는 더욱 엄밀 하 게 표현 되 었 고 개발 자 들 이 역할 영역의 동적 결 과 를 분석 하 는 데 얽 매 이지 않 아 도 되 며 잠재 적 인 bug 로 인 한 이상 결 과 를 감소 시 켰 다.