수색…
통사론
- '엄격한 사용';
- "엄격한 사용";
- `엄격한 사용`;
비고
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를 사용하거나 사용하지 않는 스크립트는 서로 다른 스크립트간에 공유되지 않기 때문에 결합 할 수 있습니다.
함수의 경우
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
객체는 strict 및 non 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";
}