잠재적 오류를 발생시키기 어려운 개발 환경을 만들고 그 환경에서 개발하는것을 위해 ES5부터 strict mode(엄격 모드)가 추가되었다.
📄 린트도구란? 정적분석 기능을 통해 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적 오류만이 아니라 잠재적 오류까지 찾아내고 오류의 원인을 리포팅해주는 유용한 도구이다.
전역의 선두 또는 함수 몸체의 선두에
'use strict'
; 를 추가한다. 전역의 선두에 추가하면 스크립트 전체에 strict mode 가 적용된다.
// 적용되는 예시
// 전역에 추가함
'use strict';
function foo(){
x = 10; // ReferenceError : is not defined
}
foo ();
// 함수 몸체의 선두에 추가 예시
function foo2(){
'use strict';
x = 10; // ReferenceError : is not defined
}
foo ();
// 적용되지 않는 예시
function foo(){
x = 10; // 에러 X
'use strict';
}
foo ();
함수 몸체의 선두에 추가하면 해당함수와 중첩함수 사이에 strict mode 가 적용된다.
함수 일일이 strict mode를 적용하는 것은 번거롭다 그리고 적용된 함수가 참조할 함수 외부의 컨택스트에 strict mode를 적용하지 않으면 문제가 생김
👉 strict mode 는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.
(function () {
// non-strict mode
var let = 10; // 에러가 발생하지 않는다.
function foo() {
"use strict";
let = 20; // 에러발생
}
foo();
})();
선언하지 않은 변수를 참조하면 ReferenceError 가 발생한다.
(function () {
'use strict';
x = 1;
console.log(x); // ReferenceError: x is not defined
}());
delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생한다.
(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 문의 사용
- with문을 사용하면 SyntaxError 가 발생한다.<br>
```javascript
(function () {
'use strict';
// SyntaxError: Strict mode code may not include a with statement
with({ x: 1 }) {
console.log(x);
}
}());
일반 함수의 this는 undefined로 바인딩 한다. 생성자 함수가 아닌 일반 함수에서는 this를 사용할 필요가 없기 때문이다.
(function () {
'use strict';
function foo() {
console.log(this); // undefined
}
foo();
function Foo() {
console.log(this); // Foo
}
new Foo();
}());
매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않는다.
(function (a) {
'use strict';
// 매개변수에 전달된 인수를 재할당하여 변경
a = 2;
// 변경된 인수가 arguments 객체에 반영되지 않는다.
console.log(arguments); // { 0: 1, length: 1 }
}(1));