모던 자바스크립트 Deep Dive - 20장 strict mode

송히·2023년 10월 29일
0
post-thumbnail

20.1 strict mode 란?

  • 암묵적 전역: 자바스크립트 엔진은 암묵적으로 전역 객체에 x 프로퍼티를 동적 생성하는 것
    -> 암묵적 전역은 오류를 발생시킬 수 있는 원인이 될 가능성 있음

  • 잠재적인 오류를 발생시키기 어려운 개발 환경을 만들고, 그 환경에서 개발하는 것이 좀 더 근본적인 해결책임
    -> ES5부터 strict mode(엄격 모드)가 추가
    => 자바스크립트 언어의 문법을 좀 더 엄격히 적용하여 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적인 에러를 발생
    (-> ESLint와 같은 린트 도구 사용도 가능)

20.2 strict mode 의 적용

  • 전역의 선두 혹은 함수 몸체의 선두에 use strict; 추가
    -> 전역의 선두에 추가하면 스크립트 전체에 적용됨
    -> 함수 몸체의 선두에 추가하면 해당 함수와 중첩 함수에 적용됨

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

  • strict mode 스크립트와 non-strict mode 스크립트를 혼용하면 오류 발생 가능
    (특히 외부 서드파티 라이브러리를 사용하는 경우 라이브러리가 non-strict mode인 경우도 있기 때문)
    -> 즉시 실행 함수로 스크립트 전체를 감싸서 스코프를 구분하고 즉시 실행 함수의 선두에 strict mode를 적용하기

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

  • 함수마다 strict mode 적용하는 건 바람직하지 X,
    strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 문제가 발생 가능
    -> strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직함

20.5 strict mode 가 발생시키는 에러

20.5.1 암묵적 전역

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

(function foo() {
    'use strict';
    
    x = 1;
    console.log(x); // ReferenceError: x is not defined
}());

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

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

(function () { 
	'use strict' ; 
	var x = 1; 
	delete x; // SyntaxError: Delete of an unqualified \
}());

20.5.4 매개변수 이름의 중복

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

(function () { 
  'use strict ' ; 
	
// SyntaxError: Dul끄icate parameter name not allowed in this context 
  function foo(x, x) { 
  return x + x; 
  } 
  console.log(foo(1, 2)); 
}());

20.5.4 with문의 사용

  • with 문을 사용하면 SyntaxError가 발생
  • 동일한 객체의 프로퍼티를 반복해서 사용할 때 객체 이름을 생략할 수 있어서 코드가 간단해지는 효과 있음
    -> 성능과 가독성이 나빠지므로 사용하지 않는 것이 좋음
(function() {
	'use strict';

    // SyntaxError: strict mode not include a with statement
    with({x :1 }) { 
    	console.log(x);
    }
}());

20.6 strict mode 적용에 의한 변화

20.6.1 일반 함수의 this

  • strict mode에서 함수를 일반 함수로 호출하면 this에 undefined가 바인딩
  • 생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기 때문 (에러 발생 X)

20.6.2 arguments 객체

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

profile
데브코스 프론트엔드 5기

0개의 댓글