미누에요
[JavaScript] strict mode 본문
자바스크립트에서는 여러모로 암묵적으로 에러를 발생시키지 않는 경우가 허다하다.
이는 유연한 프로그래밍이라고 할 수도 있지만, 복잡한 버그를 발생시킬 수 있다.
따라서 우리는 이를 좀 더 엄격하게, 틀에 가두어 사용하기 위해 strict mode를 사용할 수 있다.
우선, strict mode의 사용법이다.
'use strict';
function hello(){
x = 100;
console.log(x);
}
hello();
strict mode를 사용할 곳에 'use strict'를 작성해주면 된다.
이 'use strict'가 작성된 곳부터 적용되기 때문에, 'use strict' 위에 있는 코드가 있다면 그 코드는 strict mode가 적용되지 않는다.
이러한 strict mode를 사용하여 예방할 수 있는 문제는 아래와 같다.
- 암묵적 전역
- 변수 , 함수, 매개변수의 삭제
- 매개변수 이름의 중복
- with 문 사용
암묵적 전역은 선언되지 않은 변수를 자바스크립트 엔진이 암묵적으로 전역 변수로 선언하는 것이다.
function hello(){
x = 1000;
console.log(x);
}
hello();
위 코드에서 x를 선언한 코드는 존재하지 않는다. 함수 스코프 내에 x가 존재하지 않으므로 전역 스코프로 이동하여 찾을 것이고, 전역 스코프에도 없기 때문에 에러가 나야할 거 같다.
하지만 자바스크립트 엔진이 x를 전역 변수로 암묵적으로 선언한다.
이러한 문제에 strict mode를 사용하여 에러를 발생시킬 수 있는 것이다.
변수와 함수, 매개변수를 삭제하는 경우에도 원래는 아무 에러를 발생시키지 않지만, strict mode에서는 SyntaxError를 발생시킨다.
'use strict';
var x = 1010;
delete x; // SyntaxError : Delete of an unqualified identifier in strict mode.
매개변수 이름의 중복도 원래는 자바스크립트 엔진이 에러를 발생시키지 않는다. strict mode를 사용하면 이 또한 SyntaxError를 발생시킨다.
'use strict';
function hello(x, x){
return x + x; // SyntaxError : Duplicate parameter name not allowed in this context.
}
console.log(hello(1,2));
with 문은 전달된 객체를 스코프 체인에 추가하는 문이다. 스코프 체인을 건드리는 만큼 잘 사용하면 코드가 간단해지지만 잘못 사용한다면 코드에 치명적인 문제를 야기할 수 있으므로 사용하지 않는 것이 좋다.
strict mode에서는 with문을 사용하면 바로 SyntaxError를 발생시킨다.
'use strict';
with({x:1}){
console.log(x); // SyntaxError : Strict mode code may not inclue a with statement
}
기본적으로 자바스크립트는 굉장히 유연한 언어이기 때문에 그대로 사용한다면 발생할 수 있는 문제점이 상당수 존재한다.
그게 우리가 자바스크립트에 대해 깊게 공부하고 코드를 작성해야 하는 이유라고 생각한다.
그리고 개인적인 생각으로는 이렇게 통통 튀는 점이 바로 자바스크립트의 매력인 거 같다. ❤️