>웹 프론트엔드 >프런트엔드 Q&A >자바스크립트 엄격 모드의 차이점은 무엇인가요?

자바스크립트 엄격 모드의 차이점은 무엇인가요?

青灯夜游
青灯夜游원래의
2022-02-18 18:18:292106검색

차이점: 1. with 문의 사용은 금지됩니다. 2. this 키워드는 전역 객체를 가리키는 것이 금지됩니다. 3. 함수 내에서 호출 스택을 순회하는 것은 금지됩니다. 4. 객체는 다음과 같은 속성을 가질 수 없습니다. 5. 8진수 표기는 금지됩니다. 6. 인수 할당은 허용되지 않습니다. 7. 함수가 아닌 코드 블록에서는 함수를 선언할 수 없습니다.

자바스크립트 엄격 모드의 차이점은 무엇인가요?

이 튜토리얼의 운영 환경: Windows 7 시스템, JavaScript 버전 1.8.5, Dell G3 컴퓨터.

JavaScript 엄격 모드의 차이점

엄격 모드에서는 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, {&#39;x&#39;: {
      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", "&#39;use strict&#39;; 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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