내가 이해한대로 정리한 내용이니 정확하지 않을 수 있다. 😉
strict mode
란 오타나 문법 지식의 미비로 인한 실수를 방지하고자 ES5부터 추가된 기능이다.
자바스크립트 언어의 문법을 좀더 엄격하게 적용하여 문제가 있을법한 코드에 명시적인 에러를 발생시킨다.
ESLint 도 비슷한 동작을 수행하며
strict mode
보다는 ESLint를 더 권장한다고 한다.
strict mode
를 적용하려면 전역의 선두 또는 함수 몸체 선두에 use strict
를 추가한다.
전역의 선두에 선언시 코드 전체에 적용이 되고, 함수 몸체에 선언시 함수 내부에서만 적용이 된다.
strict mode
는 스크립트 단위로 적용이 된다. 그렇기에 strict mode
스크립트와 non-strict mode
스크립트를 혼용하는 것은 오류를 발생시킬 수 있다.
특히 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode
인 경우도 있기 때문에 전역에 strict mode
를 적용하는 것은 좋지않다.
필요할 경우 즉시 실행 함수로 스크립트 전체를 감싸 스코프를 구분하고 즉시 실행 함수의 선두에 strict mode
를 적용하자.
어떤 함수는 적용하고 어떤 함수를 적용하지 않는 것은 좋지 않으며 모든 함수에 적용하는 것도 번저롭다. 또한 적용된 함수가 참조할 함수 외부의 컨텍스트에 적용하지 않는다면 이것 또한 문제가 발생할 수 있다.
함수의 적용도 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 좋다.
선언하지 않은 변수를 참조하면 ReferenceError
가 발생한다.
(function() {
'use strict';
x = 1;
console.log(x); // ReferenceError: x is not defined
}());
delete
연산자로 변수, 함수, 매개변수를 삭제하면 Syntax Error
가 발생한다.
(function() {
'use strict';
var x = 1;
delete x; // SyntaxError: Delete of an unqualified identifier in strict mode
function foo(a) {
delete a; // SyntaxError: Delete of an unqualified identifier in strict mode
}
delete foo; // SyntaxError: Delete of an unqualified identifier in strict mode
}());
중복된 매개변수 이름을 사용하면 SyntaxError
가 발생한다.
(function() {
'use strict';
// SyntaxError: Duplicate parameter name not allowed in this context
function foo(x, x) {
return x + x;
}
console.log(foo(1, 2));
}());
with
문을 사용하면 SyntaxError
가 발생한다.
with
문은 사용하지 않는것을 권장한다.
this
strict mode
에서 함수를 일반 함수로서 호출하면 this
에 undefined
가 바인딩된다.
(function() {
'use strict';
function foo() {
console.log(this); // undefined
}
foo();
function Foo() {
console.log(this); // Foo
}
new Foo();
}());
strict mode
에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments
객체에 반영되지 않는다.
(function (a) {
'use strict';
a = 2;
console.log(arguments); // {0: 1, length: 1}
}(1));
끝