JavaScript 엄격 모드(엄격 사용)

개요

ECMAscript 5는 일반 실행 모드 외에도 두 번째 실행 모드인 "엄격 모드"를 추가합니다. 이름에서 알 수 있듯이 이 모드는 Javascript가 더 엄격한 조건에서 실행되도록 합니다.

엄격 모드를 사용하는 이유

- Javascript 구문의 불합리하고 느슨한 측면을 제거하고 이상한 동작을 줄입니다.

- 코드 실행의 일부 안전하지 않은 측면을 제거하고 코드 실행의 안전성을 보장합니다. 컴파일러 효율성 및 실행 속도 향상

- 미래에 새로운 버전의 Javascript를 위한 길을 열어주세요.

"엄격 모드"는 Javascript의 보다 합리적이고 안전하며 보다 엄격한 개발 방향을 구현합니다. IE 10을 포함한 주류 ​​브라우저는 이미 이를 지원하고 있으며 많은 대규모 프로젝트에서 이를 완전히 수용하기 시작했습니다.

반면에 "엄격 모드"에서는 동일한 코드의 실행 결과가 다를 수 있습니다. "일반 모드"에서 실행될 수 있는 일부 명령문은 "엄격 모드"에서는 실행되지 않습니다. 이러한 내용을 마스터하면 Javascript를 더 자세히 이해하고 더 나은 프로그래머가 될 수 있습니다.

플래그 입력"use strict";


호출 방법

1. 단일 스크립트의 경우

<script> strict";  콘솔. log("이것은 엄격 모드입니다.");
</script>


2. 단일 함수의 경우

function strict(){

   ";

   return "이것은 엄격 모드입니다.";

  }

  function notStrict() {

   return "이것은 일반 모드입니다. }

3 대체 방법 스크립트 파일 작성

(function (){

"use strict";

// 여기에 일부 코드

})();

예 1:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<p>浏览器按下 F12 开启调试模式,查看报错信息。</p>
<script>
"use strict";
x = 3.14;       // 报错 (x 未定义)
</script>
</body>
</html>

예 2:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>php中文网(php.cn)</title>
</head>
<body>
<p>浏览器按下 F12 开启调试模式,查看报错信息。</p>
<script>
x = 3.14;       // 不报错 
myFunction();
function myFunction() {
   "use strict";
    y = 3.14;   // 报错 (y 未定义)
}
</script>
</body>
</html>


구문 및 동작 변경:

1 전역 변수의 명시적 선언

일반 모드에서는 변수가 선언되지 않으면 할당됩니다. 값, 기본값은 전역 변수입니다. 엄격 모드에서는 이러한 사용이 금지되며 전역 변수는 명시적으로 선언되어야 합니다.

"use strict";

v = 1; // 오류가 보고됨, v가 선언되지 않음

for(i = 0; i < 2; i++) { // 오류가 보고됨, i는 not 선언

}

따라서 strict 모드에서는 변수를 사용하기 전에 var 명령으로 선언해야 합니다.


2 정적 바인딩

Javascript 언어의 특징은 "동적 바인딩"을 허용한다는 것입니다. 즉, 특정 속성과 메서드가 어떤 개체에 속하는지는 컴파일 타임에 결정되지 않고 런타임(런타임)에 결정됩니다. .

엄격 모드는 동적 바인딩에 몇 가지 제한을 적용합니다. 어떤 경우에는 정적 바인딩만 허용됩니다. 즉, 속성과 메서드가 어떤 개체에 속하는지 컴파일 단계에서 결정됩니다. 이렇게 하면 컴파일 효율성이 향상되고, 코드를 더 쉽게 읽을 수 있으며, 예상치 못한 일이 줄어듭니다.

구체적으로는 다음과 같은 측면을 포함합니다.

(1) with 문

을 사용하는 것은 금지됩니다. 왜냐하면 with 문은 컴파일 타임에 속성이 속한 객체를 결정할 수 없기 때문입니다.

"use strict";

var v = 1;

with (o){ // 구문 오류

 v = 2;

}

(2) 생성 평가 범위

일반 모드에서 Javascript 언어에는 전역 범위와 함수 범위라는 두 가지 변수 범위가 있습니다. 엄격 모드는 세 번째 범위인 eval 범위를 만듭니다.

일반 모드에서 eval 문의 범위는 전역 범위에 있는지 함수 범위에 있는지에 따라 달라집니다. 엄격 모드에서는 eval 문 자체가 범위이므로 더 이상 전역 변수를 생성할 수 없습니다. 생성되는 변수는 eval 내에서만 사용할 수 있습니다.

"엄격한 사용";

var x = 2;

console.info(eval("var x = 5; x")) // 5

console.info(x ; }

// "this"가 전역 개체를 가리키므로 false를 반환합니다. "!this"는 false입니다

function f(){

 "use strict";

  return !this;

}

// 엄격 모드에서는 this 값이 정의되지 않으므로 "!this"가 true이므로 true를 반환합니다.

(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; 수정된 할당은 오류를 보고하지 않고 자동으로 실패합니다. 엄격 모드에서는 오류가 보고됩니다.

"엄격한 사용";


var o = {};

Object.defineProperty(o, "v", { 값: 1, 쓰기 가능: false });

o.v = 2 ; // 오류 보고

엄격 모드에서는 getter 메서드를 사용하여 읽은 속성에 값을 할당할 때 오류가 보고됩니다.

"엄격한 사용";

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) 객체는 중복된 이름의 속성을 가질 수 없습니다.

일반 모드에서 객체에 중복된 이름의 속성이 여러 개 있는 경우 마지막으로 할당된 속성이 이전 값을 덮어씁니다. 엄격 모드에서는 구문 오류입니다.

"엄격한 사용";

var o = {


 p: 1,

  p: 2

}; // 구문 오류

(2) 함수에는 동일한 이름의 매개변수가 있을 수 없습니다.

일반 모드에서 함수에 동일한 이름의 매개변수가 여러 개 있는 경우,args[i ] 읽기를 사용할 수 있습니다. 엄격 모드에서는 구문 오류입니다.

"엄격한 사용";

function f(a, a, b) { // 구문 오류

   return ;

}


7 여덟 항목 금지 표기법

일반 모드에서 정수의 첫 번째 숫자가 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 인수() { } // 구문 오류

var f = new Function("arguments", "'use strict' ; return 17;"); // 구문 오류

(2) 인수는 더 이상 매개변수 변경 사항을 추적하지 않습니다

function f(a) {

 a = 2;

   return [a, 인수[0]];

}

f(1); // 일반 모드는 [ 2,2]

function f(a) {

"엄격한 사용";

 a = 2;

 return [a, 인수[0]];

}

f(1); // 엄격 모드는 [2,1]

(3)입니다. 이는args.callee

사용을 금지합니다. 즉, 익명 함수 내에서 자신을 호출할 수 없습니다.

"use strict";

var f = function() { returnargs.callee; };

f(); // 오류


9

향후 새로운 버전의 Javascript에서는 "블록 수준 범위"가 도입될 예정입니다. 새 버전에 맞춰 엄격 모드에서는 전역 범위 또는 함수 범위의 최상위 수준에서만 함수를 선언할 수 있습니다. 즉, 함수가 아닌 코드 블록 내에서는 함수를 선언할 수 없습니다.

"엄격한 사용";

if (true) {

  function f() { } // 구문 오류

}

for (var i = 0; i < 5; i++) {

  function f2() { } // 구문 오류

}


10개 예약어

향후 새 버전의 Javascript로 전환하려면 엄격 모드가 추가되었습니다. 일부 예약어: Implements, 인터페이스, let, package, private, protected, public, static, Yield.

이 단어를 변수 이름으로 사용하면 오류가 발생합니다.

function package(protected) { // 구문 오류

 "use strict";

 var Implements; // 구문 오류

}


지속적인 학습
||
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p>浏览器按下 F12 开启调试模式,查看报错信息。</p> <script> "use strict"; var public = 500; // 报错 </script> </body> </html>
  • 코스 추천
  • 코스웨어 다운로드
현재 코스웨어를 다운로드할 수 없습니다. 현재 직원들이 정리하고 있습니다. 앞으로도 본 강좌에 많은 관심 부탁드립니다~