[Javascript] strict mode

Juyeong·2022년 5월 7일
0

Javascript

목록 보기
11/12

strict mode란?

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

stirct mode가 문법을 좀 더 엄격히 적용한다고 하는데, 이것이 어떤 상황에 필요한걸까?

function foo() {
  x = 10;
}
foo();

console.log(x); // ?

위 예제를 보면, foo 함수 내에 선언하지 않은 x 변수에 10을 할당했다. 위 코드만 보면 당연히 x 변수가 선언되어 있지 않고 자바스크립트 엔진이 변수 x 선언을 찾지 못하기 때문에 참조 에러를 발생시킬 것이라고 생각했다.

그러나, 자바스크립트 엔진은 이러한 경우에 암묵적으로 전역 객체에 x 프로퍼티를 동적으로 생성한다. 이때 전역 객체의 x 프로퍼티는 마치 전역 변수처럼 사용할 수 있는 것이다.

이러한 현상을 암묵적 전역이라고 한다.

암묵적 전역은 오류를 발생시키는 원인이 될 수 있기 때문에 변수에는 반드시 var, let, const 키워드를 통해 선언해주는 것이 중요하다!

하지만 인간은 언제나 실수를 할 수 있기 때문에 좀 더 근본적인 해결책으로 strict mode가 등장하였다. (참고로 ESLint 같은 린트 도구를 사용해도 strict mode와 유사한 효과를 얻을 수 있다고 한다.)

2. strict mode의 적용

strict mode를 적용하려면 전역의 선두 또는 함수 몸체의 선두에 'use strict'; 를 추가한다.

'use strict';

function foo() {
  x = 10; // ReferenceError
}

foo();

위처럼 코드의 선두에 추가해야 하며, 코드의 선두에 위치시키지 않으면 제대로 작동하지 않는다.

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

전역에 적용한 srict mode는 스크립트 단위로 적용된다.

<!DOCTYPE html>
<html>
  <body>
    <script>
      'use strict';
    </script>
    <script>
      x = 1; 
      console.log(x); // 1
     </script>
    <script>
      'use strict';
      
      y = 1; // ReferenceError
      console.log(y);
    </script>
  </body>
</html>

위와 같이 스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지 않고 해당 스크립트에 한정되어 적용된다.

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

위에서 얘기한 것처럼 함수단위로 strict mode를 적용할 수 있지만, 어떤 함수는 strict mode를 적용하고 어떤 함수는 적용하지 않는 것은 바람직하지 않다. 따라서 strict mode는 즉시 실행 함수로 감싼 스크립트 단위로 적용하는 것이 바람직하다.

(function () {
  // non-strict mode
  var let = 10;
  
  function foo() {
    'use strict';
    
    let = 20; // SyntaxError
  }
  foo();
}());

5. strict mode가 발생시키는 에러

1) 암묵적 전역

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

2) 변수, 함수, 매개변수의 삭제

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

3) 매개변수 이름의 중복

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

4) With 문의 사용

with 문을 사용하면 SyntaxError가 발생한다. with 문은 동일한 객체의 프로퍼티를 반복해서 사용할 때 객체 이름을 생략할 수 있어서 코드가 간단해지는 효과가 있지만 성능과 가독성이 나빠지는 문제가 있다, 따라서 with 문은 사용하지 않는 것이 좋다.

profile
ios / Android developer 💻

0개의 댓글