"Strict Mode"는 ECMA-262 Edition 5에 정의 된 새로운 구문으로, 엄격한 JavaScript 구문을 사용하여 실행해야 함을 나타냅니다. 과거에 사용 된 일부 작문 방법은 다음과 같은 구문 예외를 제외합니다.
1. 변수 전에 VAR 선언이 없습니다
2. Octal Syntax 사용 : var n = 023 및 var s = "/047"
3. 진술과 함께 사용하십시오
4. 삭제를 사용하여 변수 이름을 삭제합니다 (속성 이름이 아님) : myvariable 삭제
5. 평가 또는 인수를 변수 이름 또는 함수 이름으로 사용하십시오.
6. 향후 예약 된 단어를 사용하십시오 (ECMAScript 6에서 사용 가능) : 구현, 인터페이스, Let, Package, Private, Propected, Public, STATIC 및 GAILT는 가변 이름 또는 함수 이름으로 수율
7. 명령문 블록에서 함수 선언 사용 : if (a <b) {function f () {}}
8. 다른 오류
8.1. 객체 서브 페이스 크기에서 두 개의 동일한 속성 이름을 사용하십시오. {a : 1, b : 3, a : 7}
8.2. 함수 매개 변수에서 두 개의 동일한 매개 변수 이름을 사용하십시오 : 함수 f (a, b, b) {}
이것들은 아래에 자세히 설명되어 있습니다.
1. "엄격한 모드"를 사용하는 이유
"엄격한 모델"을 설정하는 목적은 주로 다음과 같습니다.
1. JavaScript 구문의 불합리하고 불완전한 측면을 제거하고 이상한 행동을 줄입니다.
2. 코드 실행의 일부 불안을 제거하고 코드가 실행되는 안전을 보장합니다.
3. 컴파일러 효율을 향상시키고 작동 속도를 높입니다.
4. 향후 새 버전의 JavaScript의 기초를 마련하십시오.
"Strict Mode"는 JavaScript의보다 합리적이고 안전하며 엄격한 개발 방향을 반영합니다. IE 10을 포함한 주류 브라우저는 이미이를 지원했으며 많은 주요 프로젝트가이를 완전히 수용하기 시작했습니다.
반면에, 동일한 코드는 "엄격한 모드"에서 다른 실행 결과를 가질 수 있습니다. "일반 모드"로 실행할 수있는 일부 진술은 "Strict Mode"에서 실행되지 않습니다. 이러한 내용을 마스터하면 JavaScript를보다 신중하고 심도있게 이해하여 더 나은 프로그래머가됩니다.
이 기사는 "엄격한 모델"에 대한 자세한 소개를 제공합니다.
2. "엄격한 모드"선언
"엄격한 모드"를 선언하는 것은 간단하며 하나의 진술 만 있습니다.
코드 사본은 다음과 같습니다. "Strict 사용";
참고 : 이전 브라우저는 일반 문자열로 취급하여 무시합니다.
3. "엄격한 모드"의 위치 및 상황 관계를 선언합니다.
"엄격한 모드"는 주로 위치의 범위에 영향을 미칩니다. 함수에 사용되는 경우 글로벌 범위 및 기타 사용하지 않은 기능을 "엄격한 모드"로 전환하지 않습니다. 즉, 엄격한 패턴 선언의 범위는 맥락에 따라 다릅니다. Strict Mode가 글로벌 컨텍스트 (함수 범위 외부)에서 선언되면 프로그램의 모든 코드는 엄격한 모드입니다. 함수에서 엄격한 패턴이 선언되면 함수의 모든 코드는 엄격한 패턴입니다. 예를 들어, 다음 예제에서는 모든 코드가 엄격한 모드에 있으며 함수 외부의 변수 선언은 구문 오류가 발생합니다. "변수는 엄격한 모드로 정의되지 않습니다". "엄격한 모드"를 호출하는 두 가지 방법이 있으며 다른 경우에 적합합니다.
1. 전체 스크립트 파일의 경우
스크립트 파일의 첫 번째 줄에 "Strict"를 사용하면 전체 스크립트가 "Strict Mode"로 실행됩니다. 이 줄 문이 첫 번째 줄에 있지 않으면 유효하지 않으며 전체 스크립트는 "일반 모드"로 실행됩니다. 다른 모드의 코드 파일이 하나의 파일로 병합되면 특별한주의가 필요합니다.
(실제 실행 결과를 생성하는 진술이 우선하지 않는 한, "Strict 사용"은 빈 세미콜론을 직접 따르는 것과 같이 첫 번째 줄에 있지 않을 수 있습니다.)
코드 사본은 다음과 같습니다.
<cript>
"엄격한 사용";
Console.log ( "이것은 엄격한 모드입니다.");
</스크립트>
<cript>
Console.log ( "이것은 일반 모드입니다.");
</스크립트>
위의 코드는 웹 페이지에 두 개의 JavaScript 코드가 있음을 나타냅니다. 이전 스크립트 태그는 엄격한 모드이며 후자는 그렇지 않습니다.
2. 단일 함수의 경우
함수 본문의 첫 번째 줄에 "Strict"를 사용하면 전체 기능이 "Strict Mode"로 실행됩니다.
코드 사본은 다음과 같습니다.
함수 strict () {
"엄격한 사용";
반환 "이것은 엄격한 패턴입니다.";
}
function notstrict () {
반환 "이것은 일반 모드입니다.";
}
3. 스크립트 파일의 해결 방법
첫 번째 호출 방법은 파일 병합에 도움이되지 않기 때문에 두 번째 방법을 빌려서 전체 스크립트 파일을 즉시 실행되는 익명 함수에 배치하는 것이 좋습니다.
코드 사본은 다음과 같습니다.
(기능 (){
"엄격한 사용";
// 여기에 일부 코드가 있습니다
}) ();
4. "엄격한 모드"에서 구문 및 동작이 변경됩니다.
"Strict Mode"는 JavaScript의 구문 및 동작을 약간 변경했습니다.
1. 글로벌 변수의 명시 적 선언
정상 모드에서는 변수를 사용할 때 Var를 사용할 필요가 없지만 (명시 적으로 선언), 엄격한 모드에서는 변수를 사용하기 전에 선언을 사용하여 선언해야합니다. 그렇지 않으면 오류가 발생합니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
v = 1; // 오류 가보고되어 V가 선언되지 않았습니다
for (i = 0; i <2; i ++) {// 오류 가보고되었다고, 나는 선언되지 않았습니다.
}
따라서 엄격한 모드에서는 사용하기 전에 VAR 명령으로 변수를 선언해야합니다.
2. 정적 결합
JavaScript 언어의 특징은 "동적 바인딩"을 허용한다는 것입니다. 즉, 특정 속성과 메소드가 속한 객체가 컴파일 시간에 결정되지 않고 런타임에 결정됩니다.
엄격한 모드는 동적 바인딩에 약간의 제한 사항을 배치합니다. 경우에 따라 정적 결합 만 허용됩니다. 다시 말해, 속성과 메소드가 속한 객체는 편집 단계에서 결정됩니다. 이를 통해 컴파일 효율성을 향상시키고 코드를 쉽게 읽을 수 있으며 사고가 줄어 듭니다.
구체적으로, 다음과 같은 측면이 관련되어 있습니다.
(1) 진술과 함께 사용하는 것은 금지됩니다
with 명령문은 컴파일 시간에 결정할 수 없기 때문에 속성이 속한 객체.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var v = 1;
(O) {// 구문 오류가 있습니다
v = 2;
}
(2) 평가 범위를 만듭니다
일반 모드에서 JavaScript 언어에는 글로벌 범위와 기능 범위의 두 가지 변수 스코프가 있습니다. 엄격한 모드는 세 번째 범위를 생성합니다 : 평가 범위.
일반 모드에서, 평가 명령문의 범위는 그것이 글로벌 범위인지 또는 기능적 범위에 있는지에 따라 다릅니다. 엄격한 모드에서는 평가 명령문 자체가 범위이며 더 이상 글로벌 변수를 생성 할 수 없습니다. 생성하는 변수는 평가 내에서만 사용할 수 있습니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var x = 2;
console.info (Eval ( "var x = 5; x")); // 5
console.info (x); // 2
3. 향상된 안전 조치
(1)이 키워드가 글로벌 오브젝트를 가리키는 것을 금지합니다
코드 사본은 다음과 같습니다.
함수 f () {
반환! 이것;
}
// "이"가 글로벌 객체를 가리키기 때문에 거짓을 반환합니다. "!
함수 f () {
"엄격한 사용";
반환! 이것;
}
// 엄격한 모드에서는이 값의 값이 정의되지 않으므로 true를 반환합니다. "이것은"사실입니다.
따라서 생성자를 사용할 때 새로 추가하는 것을 잊어 버린 경우 더 이상 글로벌 객체를 가리키지 않지만 오류를보고합니다.
코드 사본은 다음과 같습니다.
함수 f () {
"엄격한 사용";
this.a = 1;
};
f (); // error, 이것은 정의되지 않았습니다
일반 함수 호출 f ()에서, 이것의 값은 글로벌 객체를 가리 킵니다. 엄격한 모드에서는 이것의 값이 정의되지 않은 것을 가리 킵니다. 함수가 호출 및 적용을 통해 호출되는 경우, 통과 된이 값 매개 변수가 널 및 정의되지 않은 경우를 제외한 원시 값 (문자열, 숫자, 부울 값) 인 경우이 값은 원래 값에 해당하는 래퍼 객체가됩니다. 이 값 매개 변수의 값이 정의되지 않았거나 null이면,이 값은 전역 객체를 가리 킵니다. 엄격한 모드 에서이 값의 값은 유형 변환 없이이 값 매개 변수의 값입니다.
(2) 함수 내부의 통화 스택을 가로 지르는 금지
코드 사본은 다음과 같습니다.
함수 f1 () {
"엄격한 사용";
F1. CALLER; // 오류를보고합니다
f1. 혐의; // 오류를보고합니다
}
f1 ();
4. 변수 삭제를 비활성화합니다
엄격한 모드에서는 변수를 삭제할 수 없습니다. 구성 가능한 상태로 설정된 객체 속성 만 삭제할 수 있습니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var x;
x 삭제; // 구문 오류
var o = object.create (null, 'x', {
가치 : 1,
구성 가능 : true
});
황소 삭제; // 성공적으로 삭제합니다
5. 명시 적 오류
일반 모드에서 객체의 읽기 전용 속성을 할당하면 오류가 없으며 조용히 실패합니다. 엄격한 모드에서는 오류 가보고됩니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var o = {};
Object.DefineProperty (o, "v", {value : 1, writable : false});
ov = 2; // 오류를보고합니다
엄격한 모드에서는 Getter 메소드를 사용하여 속성 읽기를 할당하면 오류 가보고됩니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var o = {
get v () {return 1; }
};
ov = 2; // 오류를보고합니다
엄격한 모드에서는 확장되지 않은 객체에 새 속성을 추가하면 오류가 발생합니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var o = {};
object.preventextensions (o);
ov = 1; // 오류를보고합니다
엄격한 모드에서는 분리되지 않은 속성을 삭제하면 오류가 발생합니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
객체 삭제. prototype; // 오류를보고합니다
6. 오류 이름 바꾸기
엄격한 모드는 일부 구문 오류를 추가했습니다.
(1) 객체는 중복 이름이있는 속성을 가질 수 없습니다
일반 모드에서 객체에 여러 중복 속성이 있으면 마지막 지정된 속성이 이전 값을 무시합니다. 엄격한 모드에서는 구문 오류입니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var o = {
P : 1,
P : 2
}; // 구문 오류
(2) 함수는 중복 이름을 가진 매개 변수를 가질 수 없습니다
일반 모드에서는 함수에 중복 이름이있는 여러 매개 변수가있는 경우 인수와 함께 읽을 수 있습니다. 엄격한 모드에서는 구문 오류입니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
함수 f (a, a, b) {// 구문 오류
반품 ;
}
7. 옥탈 표기법은 금지되어 있습니다
정상 모드에서는 정수의 첫 비트가 0이면 0100과 같은 10 대 숫자라는 것을 의미합니다. 엄격한 모드는이 표현을 금지합니다. 정수의 첫 비트가 0이면 오류 가보고됩니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var n = 0100; // 구문 오류
8. 인수 대상의 제한
인수는 함수의 매개 변수 객체이며 엄격한 모드는 사용을 제한합니다.
(1) 인수 할당은 허용되지 않습니다
코드 사본은 다음과 같습니다.
"엄격한 사용";
인수 ++; // 구문 오류
var obj = {set p (arguments) {}}; // 구문 오류
{} catch (arguments) {} // 구문 오류를 시도하십시오.
함수 arguments () {} // 구문 오류
var f = new 함수 ( "인수", " 'Strict'; return 17;"); // 구문 오류
(2) 인수는 더 이상 매개 변수의 변화를 추적하지 않습니다
코드 사본은 다음과 같습니다.
기능 f (a) {
a = 2;
반환 [a, 인수 [0]];
}
f (1); // 일반 모드는 [2,2]
기능 f (a) {
"엄격한 사용";
a = 2;
반환 [a, 인수 [0]];
}
f (1); // 엄격한 모드는 [2,1]
(3) arguments의 사용은 금지되어 있습니다
이것은 익명 기능 안에서 자신을 부를 수 없다는 것을 의미합니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
var f = function () {return arguments.callee; };
에프(); // 오류를보고합니다
9. 함수는 최상위로 선언해야합니다.
앞으로 새로운 버전의 JavaScript가 "블록 레벨 범위"를 소개 할 것입니다. 새 버전과 정렬하려면 Strict Mode를 사용하면 글로벌 범위 또는 기능 범위의 최상위 레벨에서 기능을 선언 할 수 있습니다. 즉, 비 기능 코드 블록 내에서 함수를 선언 할 수 없습니다.
코드 사본은 다음과 같습니다.
"엄격한 사용";
if (true) {
함수 f () {} // 구문 오류
}
for (var i = 0; i <5; i ++) {
함수 f2 () {} // 구문 오류
}
10. 단어를 유지하십시오
향후 새 버전의 JavaScript로 전환하기 위해 일부 예약 된 단어가 엄격한 모드에 추가되었습니다 : 구현, 인터페이스,하자, 패키지, 보호, 공개, 정적, 수율.
이 단어를 변수 이름으로 사용하면 오류가 발생합니다.
코드 사본은 다음과 같습니다.
함수 패키지 (보호) {// 구문 오류
"엄격한 사용";
var 구현; // 구문 오류
}
또한 ECMAScript의 다섯 번째 버전은 다른 예약 된 단어 (클래스, 열거, 내보내기, 확장, 가져 오기, 슈퍼)와 주요 브라우저에서 추가 된 예약 된 단어를 규정합니다.