ECMAScript5에 도입 된 엄격한 패턴을 통해 개발자는 JavaScript 실행 환경이 개발 프로세스에서 오류를 감지하기가 가장 일반적이고 어려운 일부를 처리 할 수 있도록함으로써 "더 나은"JavaScript 언어를 가질 수 있습니다. 오랫동안 Firefox 만 엄격한 모드를 지원하기 때문에 엄격한 모드에 대해 의문이있었습니다. 그러나 오늘날 모든 주류 브라우저는 최신 버전 (IE10, Opera12 및 Android 4, iOS5 포함)에서 엄격한 모드를 지원합니다. 엄격한 모드를 사용해야 할 때입니다.
엄격한 모델은 어떤 역할을 할 수 있습니까?
엄격한 패턴은 JavaScript에 많은 변경 사항을 소개하고 두 가지 범주 (명백하고 미묘한)로 나누었습니다. 사소한 개선의 목표는 현재 JavaScript의 일부 자세한 문제를 해결하는 것입니다. 관심이 있으시면 Dmitry Soshnikov ECMA-262-5가 작성한 멋진 문서를 자세히 제 2 장 엄격한 모드로 읽으십시오. 나는 주로 엄격한 모드로 도입 된 명백한 변경, 엄격한 모드를 사용하기 전에 알아야 할 개념 및 가장 도움이되는 변경 사항을 소개합니다.
특정 기능을 배우기 전에 엄격한 모드의 주요 목표 중 하나는 더 빠르고 편리하게 디버깅 할 수 있다는 것입니다. 런타임 환경이 조용히 실패하거나 이상하게 행동하는 것보다 문제를 발견 할 때 명시적인 오류를 던지는 것이 좋습니다 (종종 엄격한 모드를 켜지 않는 JavaScript 실행 환경의 경우). 엄격한 모드는 더 많은 오류가 발생하지만, 이러한 오류는주의를 끌고 이전에 발견하기 어려운 많은 잠재적 인 문제를 해결하기 때문에 좋은 일입니다.
키워드로 제거하십시오
먼저, with 명령문은 엄격한 모드에서 제거되며, 명령문이 포함 된 코드는 엄격한 모드에서 예외를 던집니다. 따라서 엄격한 모드 사용의 첫 번째 단계 : 코드에서 사용하지 않도록하십시오.
코드 사본은 다음과 같습니다.
// 다음 JavaScript 코드는 엄격한 모드에서 오류를 던집니다.
(위치) {
경고 (HREF);
}
예기치 않게 전역 변수에 값을 할당하지 않도록합니다
둘째, 로컬 변수는 할당하기 전에 선언해야합니다. 엄격한 모드가 활성화되기 전에, 동일한 이름을 가진 전역 변수는 노출되지 않은 로컬 변수를 복사 할 때 자동으로 작성됩니다. 이것은 JavaScript 프로그램에서 가장 일반적인 오류 중 하나이며 엄격한 모드 에서이 작업을 수행하려고 할 때 명시 적 예외가 발생합니다.
코드 사본은 다음과 같습니다.
// 예외는 엄격한 모드로 던져집니다
(기능() {
someundeclaredvar = "foo";
} ());
기능에서는 더 이상 기본적으로 글로벌을 가리키지 않습니다.
엄격한 모드에서 또 다른 중요한 변경 사항은 정의되거나 정의되지 않은 (NULL 또는 정의되지 않은)이 기능이 기본적으로 글로벌 환경을 가리키지 않는다는 것입니다. 예를 들어 함수의 기본 동작에 의존하는 일부 코드 실행 오류가 발생합니다.
코드 사본은 다음과 같습니다.
window.color = "빨간색";
함수 sayscolor () {
경고 (this.color);
}
// 오류는 엄격한 모드로보고됩니다. 엄격한 모드가 아닌 경우 "빨간색"을 자극합니다.
SayColor ();
// 오류는 엄격한 모드로보고됩니다. 엄격한 모드가 아닌 경우 "빨간색"을 자극합니다.
saycolor.call (null);
이것은 할당되기 전에 정의되지 않은 상태로 유지되므로 생성자가 실행되면 이전에 명확한 새 키워드가 없으면 예외가 발생합니다.
코드 사본은 다음과 같습니다.
기능인 (이름) {
this.name = 이름;
}
// 엄격한 모드에는 오류가 발생합니다
var me = person ( "nicholas");
위의 코드에서는 이전에 새로운 것이 없기 때문에 기능 의이 기능은 정의되지 않습니다. 정의되지 않은 경우 속성을 설정할 수 없으므로 위의 코드에 오류가 발생합니다. 비 스트릭 모드 환경에서는 기본적으로 Window Global Variable에 복사되지 않으며 실행 결과는 예기치 않게 Window Global 변수의 이름 속성을 설정합니다.
이름 변경을 방지하십시오
많은 코드를 작성할 때 객체 속성 및 기능 매개 변수는 실수로 중복 이름으로 쉽게 설정됩니다. 이 경우 엄격한 모드는 명시 적으로 오류를 던집니다
코드 사본은 다음과 같습니다.
// 반복 된 변수 이름은 엄격한 모드에서 오류를보고합니다.
함수 dosomething (value1, value2, value1) {
//암호
}
// Dull Object 속성 이름 이름은 엄격한 모드에서 오류를보고합니다.
var 객체 = {
Foo : "Bar",
Foo : "Baz"
};
위의 코드는 엄격한 모드에서 구문 오류로 간주되며 실행 전에 프롬프트를 얻을 수 있습니다.
안전한 평가 ()
Eval () 명령문은 결국 제거되지 않았지만 엄격한 모드에서는 여전히 개선되었습니다. 가장 큰 변화는 Eval ()에서 실행 된 변수 및 함수 선언이 현재 범위에서 해당 변수 또는 함수를 직접 생성하지 않는다는 것입니다.
코드 사본은 다음과 같습니다.
(기능() {
평가 ( "var x = 10;");
// 비 스트릭 모드에서 알림 10
// 엄격한 모드에서는 X가 정의되지 않기 때문에 예외가 발생합니다.
경고 (x);
} ());
Eval () 실행 중에 생성 된 모든 변수 또는 함수는 valit ()에 유지됩니다. 그러나 eval () 문의 반환 값에서 eval ()에서 실행 결과를 명시 적으로 가져올 수 있습니다.
코드 사본은 다음과 같습니다.
(기능() {
var result = eval ( "var x = 10, y = 20; x + y");
// 나머지 진술은 엄격하거나 비 스트릭 모드에서 올바르게 실행할 수 있습니다. (결과는 30)
경고 (결과);
} ());
읽기 전용 속성을 수정할 때 예외를 던지십시오
ECMAScript5는 또한 객체의 특정 속성을 읽기 전용으로 설정하거나 전체 객체를 수정하지 않도록하는 기능을 도입합니다. 그러나 비 스트릭 모드에서는 읽기 전용 속성을 수정하려고하면 조용히 실패합니다. 브라우저 네이티브 API를 다루는 동안 이런 일이 발생할 수 있습니다. 이 경우 엄격한 모드는 명시 적으로 예외를 제외 하고이 속성을 수정하는 것이 허용되지 않았 음을 상기시켜줍니다.
코드 사본은 다음과 같습니다.
var person = {};
Object.DefineProperty (Person, "Name"{
쓰기 가능 : 거짓,
가치 : "니콜라스"
});
// 비 스트릭 모드에서는 침묵이 실패하고 예외는 엄격한 모드에서 발생합니다.
person.name = "John";
위의 예에서는 이름 속성이 읽기 전용으로 설정됩니다. 비 스트릭 모드에서 이름 속성 수정을 실행하면 오류가 발생하지 않지만 수정은 성공하지 못합니다. 그러나 엄격한 모드는 명확하게 예외를 던질 것입니다.
참고 : ECMAScript 속성을 사용하여 지정할 때 엄격한 모드를 활성화하는 것이 좋습니다.
그것을 사용하는 방법?
최신 브라우저에서 엄격한 모드를 활성화하는 것은 매우 쉽습니다. JavaScript 코드에 다음 명령을 표시하면됩니다.
"엄격한 사용";
위의 코드는 특정 변수를 제공하지 않는 문자열 인 것처럼 보이지만 실제로 JavaScript 엔진이 엄격한 모드로 전환하는 것을 의미합니다 (엄격한 모드를 지원하지 않는 브라우저는 위의 코드를 무시하고 후속 실행에 영향을 미치지 않습니다). 이 명령어를 글로벌 또는 기능에 적용 할 수는 있지만 여기서는 지구 환경에서 엄격한 모드를 활성화하지 않도록 상기시켜야합니다.
코드 사본은 다음과 같습니다.
// 이렇게 사용하지 마십시오
"엄격한 사용";
함수 dosomething () {
// 코드 의이 부분은 엄격한 모드로 실행됩니다.
}
함수 dosomethingelse () {
// 코드 의이 부분도 엄격한 모드로 실행됩니다.
}
위의 코드는 큰 문제가 아닌 것 같습니다. 그러나 페이지에 도입 된 모든 코드를 유지할 책임이없는 경우, 이러한 방식으로 엄격한 모드를 사용하면 엄격한 모드를 위해 제 3 자 코드로 인해 발생하는 문제가 발생합니다.
따라서 함수에서 엄격한 모드를 가능하게하는 지침을 사용하는 것이 가장 좋습니다.
코드 사본은 다음과 같습니다.
함수 dosomething () {
"엄격한 사용";
//이 함수의 코드는 엄격한 모드로 실행됩니다.
}
함수 dosomethingelse () {
//이 함수의 코드는 엄격한 모드로 실행되지 않습니다.
}
하나 이상의 함수에서 엄격한 모드를 활성화하려면 즉시 투쟁하는 기능 표현식 (IFE)을 사용하십시오.
코드 사본은 다음과 같습니다.
(기능() {
"엄격한 사용";
함수 dosomething () {
//이 함수는 엄격한 모드로 실행됩니다
}
함수 dosomethingelse () {
//이 함수는 엄격한 모드로도 실행됩니다
}
} ());
결론적으로
지금부터 JavaScript 엄격한 모드를 활성화하는 것이 좋습니다. 이는 코드에서 눈치 채지 못한 오류를 발견하는 데 도움이 될 수 있습니다. 지구 환경에서는 활성화하지 않지만 가능한 한 많이 사용하여 (기능 표현식을 즉시 실행) 여러 기능에 엄격한 패턴을 적용 할 수 있습니다. 처음에는 이전에 한 번도 경험하지 못한 오류 메시지가 나타납니다. 이는 정상입니다. 엄격한 모드가 활성화되면 지원되는 브라우저에서 테스트하여 새로운 잠재적 문제를 발견하십시오. 코드에 "Strict 사용"을 추가하지 말고 나머지 코드가 제대로 작동한다고 가정하십시오. 마지막으로 엄격한 모드에서 더 나은 코드를 작성하십시오.
메모:
다음은 각 브라우저의 엄격한 모드 지원 상황에 대한 요약입니다.
이 페이지에서 현재 브라우저의 엄격한 모드 지원을 테스트 할 수 있습니다.
엄격한 모드의 장점 :
JavaScript를 강하게 만듭니다
1. 이것은 더 이상 캡슐화되지 않으며 정상 모드에서는 항상 객체였습니다.
2. fun.caller와 fun. arguments는 삭제 가능한 속성이 아니며 설정 또는 검색 할 수 없습니다.
3. Arguments.Caller는 삭제할 수없는 속성이기도합니다.
미래의 ECMAScript 버전을위한 길을 열어주세요
1. 구현, 인터페이스,하자, 패키지, 개인, 보호, 공개, 정적 및 수율.
2. 메소드 선언은 스크립트 또는 메소드의 전면에 배치되어야하며 IF 또는 FOR과 같은 문의 중간에 배치 할 수 없습니다.