>  기사  >  웹 프론트엔드  >  ECMAScript 5 Strict Mode 소개_기본 지식

ECMAScript 5 Strict Mode 소개_기본 지식

WBOY
WBOY원래의
2016-05-16 16:11:421339검색

엄격 모드는 ECMAScript 5의 새로운 기능으로, 전체 프로그램이나 특정 기능을 "엄격한" 운영 컨텍스트에 배치할 수 있습니다. 이러한 엄격한 컨텍스트는 특정 작업을 방지하고 더 많은 예외를 발생시킵니다.

ECMAScript 5는 ECMAScript 3과 역호환되지만 엄격 모드에서는 ECMAScript 3에서 더 이상 사용되지 않는 모든 기능이 호환되지 않고 비활성화되거나 오류가 발생합니다.

엄격 모드를 활성화하면 다음과 같은 이점이 있습니다.

1. 일부 프로그래밍 오류를 포착하고 예외를 발생시킵니다.
2. 상대적으로 "안전하지 않은" 작업(예: 전역 변수 액세스)을 방지하고 예외를 발생시킵니다.
3. 혼란스러운 일부 기능을 비활성화합니다.

엄격 모드에 대한 대부분의 정보는 ES5 사양[PDF]의 223페이지에서 확인할 수 있습니다.

(참고: ECMAScript 5의 엄격 모드는 Firefox의 엄격 모드와 다릅니다)

엄격 모드 활성화 방법

전체 스크립트에 대해 엄격 모드를 활성화하려면 프로그램 시작 부분에 다음 문을 추가하세요.

코드 복사 코드는 다음과 같습니다.

'엄격한 사용';

또한 외부에 영향을 주지 않도록 함수 내부에서만 엄격 모드를 활성화할 수도 있습니다.
코드 복사 코드는 다음과 같습니다.

함수 imStrict() {
'엄격한 사용';
​//...코드...
}

엄격 모드를 활성화하는 명령문은 새로운 구문 없이 "use strict"라는 일반 문자열입니다. 이는 이전 브라우저에 부정적인 영향이 없다는 것을 의미합니다.

함수 내에서 엄격 모드를 활성화하는 실제 적용은 외부 코드에 영향을 주지 않도록 전체 Javascript 클래스 라이브러리를 엄격 모드 함수 내에서 정의하는 것입니다.

코드 복사 코드는 다음과 같습니다.

// 엄격하지 않은 코드...

(함수(){
"엄격한 사용";

// 라이브러리를 엄격하게 정의하세요...
})();

// 엄격하지 않은 코드...


그렇다면 엄격 모드의 스크립트에는 어떤 변화가 있을까요?

변수 및 속성

변수를 전역 변수로 만드는 대신 정의되지 않은 변수에 대한 할당이 실패합니다.

쓰기 가능 속성이 false인 속성을 쓰거나, 구성 가능한 속성이 false인 속성을 삭제하거나, false 속성이 있는 확장 가능 속성을 추가하면 오류가 발생합니다(이러한 속성은 사전에 동의되어 있습니다). 과거에는 이러한 작업이 예외를 발생시키지 않고 조용히 실패했습니다.

변수, 함수 또는 함수 매개변수에 대해 삭제 작업을 수행하면 오류가 발생합니다.

코드 복사 코드는 다음과 같습니다.

var foo = '테스트';
함수 테스트() { }

foo 삭제 // 오류
테스트 삭제; // 오류

함수 테스트2(arg) {
인수 삭제; // 오류
}


객체 컨테이너 내부에 동일한 속성을 정의하면 예외가 발생합니다.
코드 복사 코드는 다음과 같습니다.

//오류
{ foo: 참, foo: 거짓 }

평가

"eval"이라는 이름의 사용은 금지됩니다(주요 의도는 eval 함수가 변수나 객체 속성을 가리키는 것입니다).

코드 복사 코드는 다음과 같습니다.

// 모두 오류가 발생합니다...
obj.eval = ...
obj.foo = 평가;
var eval = ...;
for ( var eval in ... ) {}
함수 eval(){}
함수 테스트(평가){}
함수(평가){}
새로운 함수("eval")

또한 eval을 통해 새 변수를 선언해도 아무런 효과가 없습니다.
코드 복사 코드는 다음과 같습니다.

eval("var a = false;");
print( typeof a ); // 정의되지 않음

기능

인수 개체를 재정의하면 오류가 발생합니다.

코드 복사 코드는 다음과 같습니다.

인수 = [...]; // 허용되지 않음

이름이 같은 매개변수는 오류를 발생시킵니다:
코드 복사 코드는 다음과 같습니다.

(function(foo, foo) { }) // 오류

Argument.caller 및 Argument.callee에 액세스하면 예외가 발생합니다. 따라서 사용해야 하는 익명 함수는 먼저 이름을 지정해야 합니다. 예:
코드 복사 코드는 다음과 같습니다.

setTimeout(나중에 함수(){
// 작업을 수행합니다...
​setTimeout(나중에, 1000);
}, 1000 );

함수의 인수, 호출자 및 호출 수신자 속성은 더 이상 존재하지 않으며 이를 정의한 작업은 금지됩니다.
코드 복사 코드는 다음과 같습니다.

함수 테스트() { }
test.caller = '발신자'; // 오류

마지막으로 오랫동안 지속되어 온(그리고 매우 성가신) BUG가 해결되었습니다. Function.prototype.call 또는 Function.prototype.apply 메소드의 첫 번째 매개변수로 null 또는 정의되지 않음을 사용하면 함수 내부의 이 매개변수가 전역 객체를 가리킵니다. . 엄격 모드는 실행을 방지하고 예외를 발생시킵니다.
코드 복사 코드는 다음과 같습니다.

(function(){ ... }).call(null) // 예외

with() { }

with() { } 문은 엄격 모드에서 완전히 손상되었습니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.