ES5부터 strict mode가 추가되었다.
- strict mode는 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성을 높임.
- 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대한 명시적인 에러를 발생시킴.
- ESLint 같은 린트 도구를 사용해 유사한 효과를 얻을 수 있다.
*ESLint :
- 정적 분석 기능을 통해 소스코드를 실행하기 전에 소스코드를 스캔하여 문법적 오류만이 아니라 잠재적 오류까지 찾아내고 오류의 원인을 리포팅해주는 도구
Strict mode의 적용
- 전역의 선두나 함수 몸체의 선두에 추가한다.
'use strict';
function foo() {
x = 10; //ReferenceError: x is not defined
}
foo();
전역에 strict mode를 적용하는 것은 피하자
- 전역에 적용한 strict mode는 스크립트 단위로 적용함. (해당 스크립트에 한정되어 적용)
- strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다.
- 특히, 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있어서 전역에 strict mode를 적용하는 것은 바람직하지 않다.
- 이러한 경우, 즉시 실행 함수로 스크립트 전체를 감싸서 스코프를 구분하고, 즉시 실행 함수의 선두에 strict mode를 적용한다.
(function () {
//즉시 실행 함수 선두에 적용
'use strict';
//Do something..
}());
함수 단위로 strict mode를 적용하는 것도 피하자
- 위와 같은 이유로 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직함.
strict mode가 발생시키는 에러 예시
- 암묵적 전역
- 변수, 함수, 매개변수의 삭제
- 매개변수 이름의 중복
- with 문의 사용
strict mode 적용에 의한 변화
일반함수의 this
- strict mode에서 일반 함수로서 호출하면 this에 undefined가 바인딩된다.
- 생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다. (에러발생x)
(function() {
'use strict';
function foo() {
console.log(this); //undefined
}
foo();
function Foo() {
console.log(this); //Foo
}
new Foo();
}());
arguments 객체
- strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경해도 arguments객체에 반영되지 않음
'Javascript' 카테고리의 다른 글
| [js] this (4) | 2025.02.09 |
|---|---|
| [js] 빌트인 객체 (2) | 2025.02.02 |
| [js] 프로토타입 (2) 프로토타입 체인, 교체, instanceof, 직접상속, 정적프로퍼티, 프로퍼티 열거 연산자 (3) | 2025.01.29 |
| [js] 프로토타입 (1) 객체지향프로그래밍, 객체와 생성자함수와 프로토타입의 관계, 객체 생성 방식에 따른 프로토타입 형태 (2) | 2025.01.23 |
| [js] 함수와 일급 객체 (2) | 2025.01.21 |