📗 내용 정리
strict mode란?
번역하자면 엄격 모드라는 말이다. 오타나 문법적 오류를 잡아낸다. ESLint와 같은 린트 도구를 사용해도 비슷하거나 더욱 강력한 효과를 얻을 수 있다. 책의 저자는 린트 도구의 사용을 선호한다고 한다.
strict mode의 적용
전역의 선두 혹은 함수 몸체의 선두에 'use strict'; 를 추가한다.
'use strict';
function foo() {
x = 10; // x is not defined.
}
function foo() {
'use strict';
x = 10; // x is not defined.
}
단, 전역에 strict mode를 적용하는 것은 피하는 것이 좋다. 스크립트 단위로 적용되기 때문에 외부 라이브러리를 사용하는 경우에는 모드가 혼용되어서 오류가 발생할 수 있다.
<script>
// 적용
'use strict';
</script>
<script>
// 미적용
</script>
함수 단위로 strict mode를 적용하는 것도 바람직하지는 않다. 함수마다 일일이 조건을 적용하는 것은 번거롭기도 하고 함수마다 규칙이 다르면 혼란스럽기 때문이다.
가장 바람직한 적용 방법은 즉시 실행 함수로 적용하는 방법이다.
strict mode가 발생시키는 에러
아래는 기본적인 문법적 에러 예시들이다.
암묵적 전역
선언하지 않은 변수를 참조하면 RefrenceError가 발생한다. 암묵적 전역에 대한 설명은 뒤에 나올 21.4절에서 더 자세히 설명될 것이다.
변수, 함수, 매개변수의 삭제
'use strict';
var x = 1;
delete x;
매개변수 이름의 중복
with 문의 사용
with 문은 객체를 스코프 체인에 전달해서 객체의 프로퍼티를 사용할 때 객체 이름을 생략할 수 있게 한다. 그렇지만 성능과 가독성이 나빠지기 때문에 사용을 권장하고 있지 않다. strict mode에서도 사용하면 에러가 난다.
with 문을 사용하는 방법. (Math 객체 이름을 반복하지 않게 할 수 있다.)
var a,x,y;
var r =10;
with(Math){
a =PI*r *r;
x =r *cos(PI);
y =r *sin(PI/2);
}
strict mode 적용에 의한 변화
일반 함수의 this
생성자가 아닌 일반 함수에서 this를 쓰면 undefined가 바인딩된다.
strict mode를 적용하지 않았을 때 전역 객체가 바인딩된다.
arguments 객체
매개변수에 전달된 인수를 재할당해도 arguments 객체에 반영되지 않는다.
(funtion(a){
'strict mode';
a = 2;
console.log(arguments); // { 0: 1, length: 1 }
})(1);
'Today I Learned' 카테고리의 다른 글
모던 자바스크립트 Deep Dive 23장 실행 컨텍스트 (0) | 2022.03.30 |
---|---|
모던 자바스크립트 Deep Dive 21장 빌트인 객체 (0) | 2022.03.20 |
모던 자바스크립트 Deep Dive 19장 프로토타입 (0) | 2022.03.09 |
모던 자바스크립트 Deep Dive 18장 함수와 일급 객체 (0) | 2022.03.01 |
모던 자바스크립트 Deep Dive 17장 생성자 함수에 의한 객체 생성 (0) | 2022.03.01 |