rustandbone Developer

모던 JS deep dive 2회차 챕터 20 strict mode

모던 JS deep dive 2회차

20. strict mode

20.1 strict mode란?

암묵적 전역(implicit global) : 자바스크립트 엔진은 암묵적으로 전역 객체에 프로퍼티 동적 생성

암묵적 전역은 오류를 발생시키는 원인으로, 반드시 변수 키워드 사용하여 변수 선언해야 함

실수는 언제나 발생할 수 있기에
잠재적 오류를 발생시키기 어려운 개발 환경을 만들고
그 환경에서 개발하는 것이 좀 더 근본적인 해결책

ES5부터 strict mode(엄격 모드) 추가
언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생

ESLint같은 린트 도구도 유사한 효과를 얻을 수 있음
ESLint : 정적 분석(static analysis) 기능을 통해 소스코드 실행 전 소스코드 스캔하여 문법적 오류, 잠재적 오류까지 찾아내고 오류 원인 리포팅해주는 도구 + 코딩 컨벤셔 강제 가능

20.2 strict mode의 적용

전역의 선두 또는 함수 몸체의 선두에 ‘use strict’; 추가.
전역 선두에 추가하면 스트립트 전체에 적용됨
함수 몸체 선두에 추가하면 해당 함수와 중첩 함수에 적용됨

20.3 전역에 strict mode를 적용하는 것은 피하자

전역에 적용한 엄격모드는 스크립트 단위로 적용.

다른 스크립트에 영향을 주지 않고 해당 스크립트에 한정되어 적용. 이처럼 strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있음

=> 즉시 실행 함수로 스크립트 전체를 감싸서 스코프를 구분하고 즉시 실행 함수의 선두에 strict mode를 적용

20.4 함수 단위로 strict mode를 적용하는 것도 피하자

함수 단위로 엄격모드를 적용할 수 있으나 부분만 적용하는 것은 바람직하지 않음. 모든 함수에 일일이 적용하는 것도 번거로움

적용된 함수가 참조할 함수 외부의 컨텍스트에 엄격 모드가 적용되지 않는다면 문제 발생 가능

즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직

20.5 strict mode가 발생시키는 에러

20.5.1 암묵적 전역

선언하지 않은 변수를 참조하면 ReferenceError 발생

20.5.2 변수, 함수, 매개변수의 삭제

delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError 발생

20.5.3 매개변수 이름의 중복

중복된 매개변수 이름을 사용하면 SyntaxError 발생

20.5.4 with문의 사용

with 문을 사용하면 SyntaxError 발생

20.6 strict mode 적용에 의한 변화

20.6.1 일반 함수의 this

엄격 모드에서 함수를 일반 함수로 호출하면 thisundefined가 바인딩
(생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문)

20.6.2 arguments 객체

매개변수에 전달된 인수를 재할당하여 변경해도 arguments 객체에 반영되지 않음