차이점: 1. with 문의 사용은 금지됩니다. 2. this 키워드는 전역 객체를 가리키는 것이 금지됩니다. 3. 함수 내에서 호출 스택을 순회하는 것은 금지됩니다. 4. 객체는 다음과 같은 속성을 가질 수 없습니다. 5. 8진수 표기는 금지됩니다. 6. 인수 할당은 허용되지 않습니다. 7. 함수가 아닌 코드 블록에서는 함수를 선언할 수 없습니다.
이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.
엄격 모드에서는 Javascript의 구문과 동작이 일부 변경되었습니다.
1 전역 변수의 명시적 선언
일반 모드에서 변수에 선언하지 않고 값을 할당하면 기본값이 전역 변수가 됩니다. 엄격 모드에서는 이러한 사용이 금지되며 전역 변수는 명시적으로 선언되어야 합니다.
"use strict"; v = 1; // 报错,v未声明 for(i = 0; i < 2; i++) { // 报错,i未声明 }
따라서 strict 모드에서는 변수를 사용하기 전에 var 명령으로 선언해야 합니다.
2 정적 바인딩
Javascript 언어의 특징은 "동적 바인딩"을 허용한다는 것입니다. 즉, 특정 속성과 메서드가 어떤 개체에 속하는지는 컴파일 타임이 아니라 런타임(런타임)에 결정됩니다. 단호한.
엄격 모드는 동적 바인딩에 몇 가지 제한을 적용합니다. 어떤 경우에는 정적 바인딩만 허용됩니다. 즉, 속성과 메서드가 어떤 개체에 속하는지 컴파일 단계에서 결정됩니다. 이렇게 하면 컴파일 효율성이 향상되고, 코드를 더 쉽게 읽을 수 있으며, 예상치 못한 일이 줄어듭니다.
구체적으로는 다음과 같은 측면을 포함합니다.
(1) with 문
을 사용하는 것은 금지됩니다. with 문은 컴파일 타임에 속성이 속한 객체를 결정할 수 없기 때문입니다.
"use strict"; var v = 1; with (o){ // 语法错误 v = 2; }
(2) 평가 범위 만들기
일반 모드에서 Javascript 언어에는 전역 범위와 함수 범위라는 두 가지 변수 범위가 있습니다. 엄격 모드는 세 번째 범위인 eval 범위를 만듭니다.
일반 모드에서 eval 문의 범위는 전역 범위에 있는지 함수 범위에 있는지에 따라 달라집니다. 엄격 모드에서는 eval 문 자체가 범위이므로 더 이상 전역 변수를 생성할 수 없습니다. 생성되는 변수는 eval 내에서만 사용할 수 있습니다.
"use strict"; var x = 2; console.info(eval("var x = 5; x")); // 5 console.info(x); // 2
3 강화된 보안 조치
(1) 이 키워드가 전역 객체를 가리키는 것을 금지합니다
function f(){ return !this; } // 返回false,因为"this"指向全局对象,"!this"就是false function f(){ "use strict"; return !this; } // 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
따라서 생성자를 사용할 때 new 추가를 잊어버리면 더 이상 이 키워드가 전역 객체를 가리키지 않습니다. 전역 개체이지만 오류입니다.
function f(){ "use strict"; this.a = 1; }; f();// 报错,this未定义
(2) 함수 내부의 호출 스택을 순회하는 것은 금지됩니다
function f1(){ "use strict"; f1.caller; // 报错 f1.arguments; // 报错 } f1();
4 변수 삭제는 금지됩니다
Strict 모드에서는 변수를 삭제할 수 없습니다. 구성 가능 항목이 true로 설정된 객체 속성만 삭제할 수 있습니다.
"use strict"; var x; delete x; // 语法错误 var o = Object.create(null, {'x': { value: 1, configurable: true }}); delete o.x; // 删除成功
5 명시적 오류 보고
일반 모드에서 개체의 읽기 전용 속성에 값을 할당하면 오류가 보고되지 않지만 자동으로 실패합니다. 엄격 모드에서는 오류가 보고됩니다.
"use strict"; var o = {}; Object.defineProperty(o, "v", { value: 1, writable: false }); o.v = 2; // 报错
엄격 모드에서는 getter 메서드를 사용하여 읽은 속성에 값을 할당할 때 오류가 보고됩니다.
"use strict"; var o = { get v() { return 1; } }; o.v = 2; // 报错
엄격 모드에서는 확장이 금지된 개체에 새 속성을 추가하면 오류가 발생합니다.
"use strict"; var o = {}; Object.preventExtensions(o); o.v = 1; // 报错
엄격 모드에서는 삭제할 수 없는 속성을 삭제하면 오류가 보고됩니다.
"use strict"; delete Object.prototype; // 报错
6 중복 이름 오류
Strict 모드에 몇 가지 새로운 구문 오류가 추가되었습니다.
(1) 객체는 중복된 이름을 가진 속성을 가질 수 없습니다
일반 모드에서 객체에 중복된 이름을 가진 여러 속성이 있는 경우 마지막으로 할당된 속성이 이전 값을 덮어씁니다. 엄격 모드에서는 구문 오류입니다.
"use strict"; var o = { p: 1, p: 2 }; // 语法错误
(2) 함수에는 동일한 이름의 매개변수가 있을 수 없습니다
일반 모드에서 함수에 동일한 이름의 매개변수가 여러 개 있는 경우 인수[i]를 사용하여 읽을 수 있습니다. 엄격 모드에서는 구문 오류입니다.
"use strict"; function f(a, a, b) { // 语法错误 return ; }
7 8진수 표현 금지
일반 모드에서 정수의 첫 번째 숫자가 0이면 8진수임을 의미합니다. 예를 들어 0100은 10진수 64와 같습니다. 엄격 모드에서는 이 표현이 금지되며 정수의 첫 번째 비트는 0이며 오류가 보고됩니다.
"use strict"; var n = 0100; // 语法错误
8 인수 객체의 제한
arguments는 함수의 매개변수 객체이며 엄격 모드에서는 사용이 제한됩니다.
(1) 인수에 대한 할당은 허용되지 않습니다
"use strict"; arguments++; // 语法错误 var obj = { set p(arguments) { } }; // 语法错误 try { } catch (arguments) { } // 语法错误 function arguments() { } // 语法错误 var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
(2) 인수는 더 이상 매개 변수 변경 사항을 추적하지 않습니다
function f(a) { a = 2; return [a, arguments[0]]; } f(1); // 正常模式为[2,2] function f(a) { "use strict"; a = 2; return [a, arguments[0]]; } f(1); // 严格模式为[2,1]
(3) 인수.callee 사용은 금지됩니다
이는 다음을 수행할 수 없음을 의미합니다. 익명이어야 합니다. 함수는 내부적으로 자신을 호출합니다.
"use strict"; var f = function() { return arguments.callee; }; f(); // 报错
9 함수는 최상위 수준에서 선언해야 합니다
향후 새 버전의 Javascript에는 "블록 수준 범위"가 도입될 예정입니다. 새 버전에 맞춰 엄격 모드에서는 전역 범위 또는 함수 범위의 최상위 수준에서만 함수를 선언할 수 있습니다. 즉, 함수가 아닌 코드 블록 내에서는 함수를 선언할 수 없습니다.
"use strict"; if (true) { function f() { } // 语法错误 } for (var i = 0; i < 5; i++) { function f2() { } // 语法错误 }
【相关推荐:javascript学习教程】
위 내용은 자바스크립트 엄격 모드의 차이점은 무엇인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!