Strict Mode는 ECMAScript 5의 새로운 기능입니다. 전체 프로그램 또는 함수를 "엄격한"작업 컨텍스트에 배치 할 수 있습니다. 이 엄격한 컨텍스트는 특정 작업을 방지하고 더 많은 예외를 던집니다.
ECMAScript 5는 ECMAScript 3과 역 호환되지만 엄격한 모드에서는 ECMAScript 3에서 선호하지 않는 모든 기능이 호환되지 않고 비활성화되거나 오류가 발생합니다.
Strict Mode는 다음과 같은 이점이 있습니다.
1. 프로그래밍 오류를 포착하고 예외를 던지십시오.
2. 상대적으로 "안전하지 않은"작업 (예 : 글로벌 변수 액세스)이 수행되는 것을 방지하고 예외가 발생합니다.
3. 혼란스러운 기능을 비활성화합니다.
엄격한 모드에 대한 대부분의 정보는 ES5 코드 [PDF]의 223 페이지에서 찾을 수 있습니다.
(참고 : ECMAScript 5의 엄격한 모드는 엄격한 Firefox 모드와 다릅니다)
엄격한 모드를 활성화하는 방법
전체 스크립트에 대한 엄격한 모드를 활성화하려면 프로그램의 시작 부분 에서이 문을 추가하십시오.
코드 사본은 다음과 같습니다.
'엄격한 사용';
기능 내부에서만 엄격한 모드를 활성화하여 외부에 영향을 미치지 않도록 할 수 있습니다.
코드 사본은 다음과 같습니다.
함수 imstrict () {
'엄격한 사용';
// ... 코드 ...
}
엄격한 모드를 가능하게하는 문은 새로운 구문없이 일반적인 문자열 "Strict"입니다. 이것은 이전 브라우저에 부정적인 영향을 미치지 않을 것임을 의미합니다.
함수 내에서 엄격한 모드를 활성화하는 실질적인 적용 중 하나는 엄격한 모드 기능 내에서 전체 JavaScript 클래스 라이브러리를 정의하여 외부 코드에 영향을 미치지 않도록하는 것입니다.
코드 사본은 다음과 같습니다.
// 비 스트릭 코드 ...
(기능(){
"엄격한 사용";
// 라이브러리를 엄격하게 정의합니다 ...
}) ();
// 비 스트릭 코드 ...
그렇다면 엄격한 모드에서 스크립트에서 어떤 변화가 있었습니까?
변수 및 속성
이 변수를 글로벌 변수로 사용하는 대신 정의되지 않은 변수를 할당하면 실패합니다.
쓰기 가능한 속성이있는 속성을 작성하거나, 구성 가능한 속성을 갖는 속성을 삭제하거나, 허위로 확장 가능한 속성을 가진 속성을 추가하면 오류가 발생합니다 (이러한 특성은 사전에 합의됩니다). 과거에는 이러한 작전은 예외를 제외하지 않았지만 단순히 조용히 실패했습니다.
변수, 함수 또는 함수 매개 변수에서 작업 삭제 수행은 오류가 발생합니다.
코드 사본은 다음과 같습니다.
var foo = '테스트';
기능 test () {}
foo 삭제; // 오류
테스트 삭제; // 오류
기능 test2 (arg) {
arg 삭제; // 오류
}
객체 컨테이너 내에서 동일한 속성을 정의하면 예외가 발생합니다.
코드 사본은 다음과 같습니다.
// 오류
{foo : true, foo : false}
평가
"Eval"이라는 이름의 사용 (주된 목적은 평가 함수를 변수 또는 객체의 속성에 가리키는 것)은 금지됩니다.
코드 사본은 다음과 같습니다.
// 모든 오류가 발생합니다 ...
obj.eval = ...
obj.foo = 평가;
var eval = ...;
for (var eval in ...) {}
함수 평가 () {}
기능 테스트 (Eval) {}
함수 (평가) {}
새로운 기능 ( "평가")
또한 Eval을 통해 새 변수를 선언하면 유효하지 않습니다.
코드 사본은 다음과 같습니다.
평가 ( "var a = false;");
인쇄 (A 형); // 한정되지 않은
기능
인수를 다시 작성하면 오브로 오류가 발생합니다.
코드 사본은 다음과 같습니다.
인수 = [...]; // 허용되지 않습니다
이름이 같은 매개 변수는 오류가 발생합니다.
코드 사본은 다음과 같습니다.
(함수 (foo, foo) {}) // 오류
arguments.caller 및 arguments.callee에 대한 액세스는 예외를 던집니다. 따라서 사용해야하는 익명 기능은 예를 들어 먼저 명명되어야합니다.
코드 사본은 다음과 같습니다.
settimeout (function omear () {
// 일을 ...
settimeout (나중에 1000);
}, 1000);
함수의 인수, 발신자 및 칼리 속성은 더 이상 존재하지 않으며이를 정의하는 작업도 금지됩니다.
코드 사본은 다음과 같습니다.
기능 test () {}
test.caller = '발신자'; // 오류
마지막으로, 장기간 (그리고 매우 성가신) 버그가 해결되었습니다. null 또는 undefined가 function.prototype.call.call.call.prototype.apply 메소드의 첫 번째 매개 변수로 사용될 때이 함수 내부는 전역 객체를 가리 킵니다. 엄격한 모드는 실행을 방지하고 예외를 제외합니다.
코드 사본은 다음과 같습니다.
(function () {...}). Call (null); // 예외
와 함께() { }
with () {} 문은 엄격한 모드로 완전히 매달려 있습니다.