수색…


통사론

  • '엄격한 사용';
  • "엄격한 사용";
  • `엄격한 사용`;

비고

Strict 모드는 ECMAScript 5에서 몇 가지 하위 호환성을 향상시키기 위해 추가 된 옵션입니다. "엄격 모드"코드의 동작 변경 내용은 다음과 같습니다.

  • 정의되지 않은 변수에 할당하면 새 전역 변수를 정의하는 대신 오류가 발생합니다.
  • 쓸 수없는 속성 (예 : window.undefined )을 할당하거나 삭제하면 자동으로 실행하는 대신 오류가 발생합니다.
  • 레거시 8 진법 구문 (예 : 0777 )은 지원되지 않습니다.
  • with 문은 지원되지 않습니다.
  • eval 은 주변 범위에 변수를 만들 수 없습니다.
  • 함수의 .caller.arguments 속성은 지원되지 않습니다.
  • 함수의 매개 변수 목록은 중복을 가질 수 없습니다.
  • window 더 이상 자동 this 값으로 사용되지 않습니다.

참고 : - ' strict '모드는 기본적으로 페이지가 비 엄격 모드의 기능에 의존하는 JavaScript를 사용하는 것처럼 활성화되지 않습니다. 그러면 해당 코드가 중단됩니다. 따라서 프로그래머가 직접 켜야합니다.

전체 스크립트의 경우

Strict 모드는 "use strict"; 문을 배치하여 전체 스크립트에 적용 할 수 있습니다 "use strict"; 다른 어떤 진술보다 먼저.

"use strict";
// strict mode now applies for the rest of the script

엄격 모드는 "use strict" 을 정의한 스크립트에서만 사용할 수 "use strict" . strict state를 사용하거나 사용하지 않는 스크립트는 서로 다른 스크립트간에 공유되지 않기 때문에 결합 할 수 있습니다.

6

참고 : ES2015 + 모듈클래스 내에 작성된 모든 코드는 기본적으로 엄격합니다.

함수의 경우

Strict 모드는 "use strict"; 앞에 붙여서 단일 함수에 적용 할 수도 있습니다 "use strict"; 명령문은 함수 선언의 시작 부분에 있습니다.

function strict() {
   "use strict";
   // strict mode now applies to the rest of this function
   var innerFunction = function () {
     // strict mode also applies here
   };
}

function notStrict() {
  // but not here
}

Strict 모드는 내부 범위 함수에도 적용됩니다.

전역 속성의 변경 사항

비 엄격 모드 범위에서 변수가 var , const 또는 let 키워드로 초기화되지 않고 할당되면 변수는 전역 범위에서 자동으로 선언됩니다.

a = 12;
console.log(a); // 12

그러나 strict 모드에서는 선언되지 않은 변수에 액세스하면 참조 오류가 발생합니다.

"use strict";
a = 12; // ReferenceError: a is not defined
console.log(a);

자바 스크립트는 예상치 못한 경우가 많기 때문에 유용합니다. 엄격하지 않은 모드에서는 이러한 이벤트로 인해 개발자가 버그 또는 예기치 않은 동작으로 이어질 수 있으므로 엄격 모드를 사용하도록 설정하면 throw되는 모든 오류로 인해 수행중인 작업을 정확히 알 수 있습니다.


"use strict";
                       // Assuming a global variable mistypedVariable exists
mistypedVaraible = 17; // this line throws a ReferenceError due to the 
                       // misspelling of variable

엄격 모드의이 코드는 가능한 한 시나리오를 표시합니다. 즉, 할당 오류의 줄 번호를 가리키는 참조 오류가 발생하여 개발자가 변수 이름의 실수를 즉시 감지 할 수 있습니다.

비 엄격 모드에서는 오류가 발생하지 않고 할당이 성공적으로 수행 된 것 외에도 mistypedVaraible 이 전역 변수로 전역 변수로 자동 선언됩니다. 이는 개발자가 코드에서이 특정 할당을 수동으로 찾아야 함을 의미합니다.


또한, 변수의 선언을 강요함으로써, 개발자는 실수로 함수 내에서 전역 변수를 선언 할 수 없습니다. 비 엄격 모드에서 :

function foo() { 
   a = "bar"; // variable is automatically declared in the global scope
}
foo();
console.log(a); // >> bar

strict 모드에서는 명시 적으로 변수를 선언해야합니다.

function strict_scope() { 
   "use strict";
   var a = "bar"; // variable is local
}
strict_scope();
console.log(a); // >> "ReferenceError: a is not defined"

변수는 함수의 외부 및 함수 뒤에 선언 할 수 있으므로 전역 범위와 같이 사용할 수 있습니다.

function strict_scope() { 
   "use strict";
   a = "bar"; // variable is global
}
var a;
strict_scope();
console.log(a); // >> bar

속성 변경

Strict 모드를 사용하면 삭제할 수없는 속성을 삭제할 수 없습니다.

"use strict";
delete Object.prototype; // throws a TypeError

엄격한 모드를 사용하지 않으면 위의 명령문이 무시됩니다. 그러나 이제는 예상대로 실행되지 않습니다.

또한 확장 할 수없는 속성을 확장 할 수 없습니다.

var myObject = {name: "My Name"}
Object.preventExtensions(myObject);

function setAge() {
    myObject.age = 25;   // No errors
}

function setAge() {
    "use strict";
    myObject.age = 25;  // TypeError: can't define property "age": Object is not extensible
}

함수의 인수 목록의 동작

arguments 객체는 strictnon strict 모드에서 다르게 동작합니다. 비 엄격 모드에서, argument 객체는 존재하는 매개 변수 값의 변경을 반영하지만 엄격 모드에서는 매개 변수 값에 대한 변경 사항이 argument 객체에 반영되지 않습니다.

function add(a, b){
    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 5,10
}

add(1, 2);

위의 코드에서 arguments 객체는 매개 변수의 값을 변경하면 변경됩니다. 그러나 엄격 모드의 경우 동일한 내용이 반영되지 않습니다.

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // Prints : 1,2

    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // Prints : 1,2
}

매개 변수 중 하나라도 undefined 경우 엄격 모드 또는 비 엄격 모드에서 매개 변수의 값을 변경하려고하면 arguments 객체가 변경되지 않은 상태로 유지됩니다.

엄격 모드

function add(a, b) {
    'use strict';

    console.log(arguments[0], arguments[1]); // undefined,undefined 
                                             // 1,undefined
    a = 5, b = 10;

    console.log(arguments[0], arguments[1]); // undefined,undefined
                                             // 1, undefined
}
add();
// undefined,undefined 
// undefined,undefined

add(1)
// 1, undefined
// 1, undefined

비 엄격 모드

function add(a,b) {

    console.log(arguments[0],arguments[1]);

    a = 5, b = 10;

    console.log(arguments[0],arguments[1]);
}
add();
// undefined,undefined 
// undefined,undefined

add(1);
// 1, undefined
// 5, undefined

중복 매개 변수

Strict 모드에서는 중복 된 함수 매개 변수 이름을 사용할 수 없습니다.

function foo(bar, bar) {}  // No error. bar is set to the final argument when called

"use strict";
function foo(bar, bar) {}; // SyntaxError: duplicate formal argument bar

엄격 모드에서의 기능 범위 지정

Strict Mode에서 로컬 블록에 선언 된 함수는 블록 외부에서 액세스 할 수 없습니다.

"use strict";
{
  f(); // 'hi'
  function f() {console.log('hi');}
}
f(); // ReferenceError: f is not defined

Scope-wise, Strict Mode의 함수 선언은 let 또는 const 와 같은 바인딩을 사용합니다.

단순하지 않은 매개 변수 목록

function a(x = 5) {
  "use strict";
}

위의 것과 같은 비 단순 매개 변수 목록이있는 함수에서 "use strict" 지시문을 사용할 수 없기 때문에 JavaScript가 유효하지 않으며 SyntaxError 를 throw합니다. 기본 할당 x = 5

단순하지 않은 매개 변수에는 다음이 포함됩니다.

  • 기본 할당
function a(x = 1) {
  "use strict";
}
  • 파괴
function a({ x }) {
  "use strict";
}
  • 나머지 매개 변수
function a(...args) {
  "use strict";
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow