자바스크립트 엄격 모드('use strict';)의 개념과 제약 사항의 이해

'use strict'는 자바스크립트의 구문이 실행되는 환경을 설정하는 예약어입니다.

'use strict';

와 같이 단일 구문으로 사용합니다. 한글로는 "엄격 모드"로 사용합니다.

자바스크립트 파일 전역으로, 또는 개별 함수 단위로 선언해서 사용할 수 있습니다.

자바스크립트 파일 전역으로 선언을 할 때는 파일 맨 위에 작성해서 표시를 합니다.

'use strict'는 자바스크립트의 의도치 않은 오류를 막아주는 수단으로 알려졌고, 또 그렇게 사용하고 있지만, 실제로는 조금 다르기도 하고, 사용상의 주의점도 여러 가지 있습니다.

항상 그렇지만 잘 알고 사용하면 자바스크립트의 여러가지 잠재적인 오류를 막아주는데 많은 도움을 주지만, 잘못 사용하면 없던 오류를 새로 만들어내는 애물단지가 될 수도 있습니다.

use strict 사용으로 발생하는 제약 조건들

  • 전역 변수를 허용하지 않으며, 전역 변수 선언시 오류가 발생합니다.
  • 변수 이름 선언 및 사용시 "var"가 누락되면 오류가 발생합니다.
  • 값 할당 실패는 오류가 발생합니다 (NaN = 1;).
  • 삭제할 수없는 속성을 삭제하려고 하면 (Object.prototype 삭제) 오류가 발생합니다.
  • 읽기 전용 속성에 쓰기를 하려고 하면 오류가 발생합니다.
  • 객체 리터럴의 모든 속성 이름은 고유해야합니다. (var x = {x1 : "1", x1 : "2"}).
  • 함수의 파라메터는 고유해야 합니다. (function calc (x, x) {}와 같이 같은 파라미터 이름 중복 사용 금지).
  • 8 진수 구문과 8진수 이스케이프 표현 금지(var a = 010; 과 같은 8진수 표현 사용 금지)
  • with 키워드 금지
  • 'eval', 'agruments'는 예약어로 변수명으로 사용할 수 없음.(var eval = 1;)
  • 변수를 생성하는 eval()은 보안상 사용할 수 없습니다.(eval ("var x = 2");)
  • 변수 이름과 함수 이름 삭제 금지 (var a = 1; delete a;)
  • arguments.callee 미지원. arguments.callee 속성은 이름이 없는 익명 함수(anonymous function)를 선언해서 사용할 때 실행 중인 함수 안에서 함수 자신을 참조하기 위해서 사용합니다. 재귀 호출 방식으로 자신을 호출하는 방식은 잠재적으로 참조 오류를 발생시킬 수 있습니다.

'use strict' 를 사용하는지 체크하기

전역 객체인 this와 자바스크립트 함수를 사용해 엄격 모드가 실행 중인지 확인할 수 있습니다.

전역 this는 엄격 모드에서 사용할 수 없기 때문에 this 가 사용 가능하면 일반 모드이고 true가 됩니다. "!true"는 false가 반환하고 엄격 모드가 아님을 알려주게 됩니다.

function isStrictMode(){
    return !this;
}

'use strict'를 사용한다고 더 안정적인 코드가 되지는 않는다.

'use stict'는 더 엄격하게 코드 사용 규칙을 제한하고, 잠재적으로 오류가 발생할 수 있는 전역 변수 사용을 제한하기 때문에 더 좋은 코드를 작성하는데 도움을 주는 것은 분명합니다.

그렇다고 'use strict' 사용이 극적으로 더 안정적인 코드를 만들어주는 것은 아닙니다.

대부분의 자바스크립트 코드에서 가장 크고 빈번하게 문제를 일으키는 것은 로직의 오류입니다.

'use strict'를 선언해서 잘못된 대입을 차단해주는 등의 문제를 피하는 것은 어디까지나 기계적인 문제들에 대해 오류를 표시해서 몇가지 문제들을 피할 수 있게 해주는 것입니다.

'use strict'가 아니어도 이런 잠재적인 대입 문제는 대부분의 경우 이후의 실행 로직에서 문제를 일으키기 때문에 오류를 확인하지 못하고 넘어갈 가능성은 생각보다 낮습니다. 그리고, 경우에 따라서는 전역 변수와 전역 this는 코드를 더 간결하고 짧게 만들어주는데 도움이 되기도 합니다.

애초에 코딩 스킬이 있어서 이런 기초적인 문제들을 일으키는 코드를 작성하지 않는 개발자라면 'use strict' 사용이 비약적으로 코드의 품질을 높여주고 오류를 줄여주는 효과가 생기지는 않습니다.

어디까지나 자바스크립트 코딩에 도움을 주는 한가지 도구이지 만능은 아닙니다.

이미 작성한 자바스크립트에 'use stict'를 사용하는 것은 피해야 한다.

이미 작성해서 사용하고 있는 자바스크립트 파일에 'use strict'를 사용하는 것은 피해야 합니다.

정말 예기치 않은 문제를 발생시킬 수도 있으며, 경우에 따라서는 무수히 많은 예외 오류를 발생시키기도 합니다.

특히 전역 this와 전역 변수를 사용하는 자바스크립트 코드는 'use strict' 사용으로 인해 전면적인 수정을 해야 할 수도 있습니다.

또 문제가 없이 실행되어 왔던 잠재적인 대입 오류도 모두 예외 오류를 발생시키기 때문에 전체적인 자바스크립트 파일의 로직을 재검토해야 하는 상황을 맞게 될 수도 있습니다.

예를 들어 다음과 같은 자바스크립트 변수 값 할당은

var a = 10;
var b = 010;

'use strict' 이 없는 경우 a는 10진수로 10, b는 10진수로 8이 됩니다.

변수 b는 앞에 0이 더 붙어있고, 자바스크립트에서 이렇게 표현한 숫자 값은 8진수로 처리가 됩니다.

이렇게 작성된 코드 상단에 'use strict'를 추가하면 a는 그래도 10진수 10이 되지만, b는 'use strict' 모드에서는 사용할 수 없다는 오류가 발생합니다.

만약에 의도적으로 변수 b에 8진수를 사용한 경우, 'use strict'을 추가함으로써 멀쩡하게 사용하던 코드에 전혀 예기치 못한 문제를 새로 발생시키게 됩니다.

반대로 'use strict'는 새로 자바스크립트 파일을 만드는 시점에는 필수적으로 사용하는 것이 좋습니다.

또는, 초보 개발자라면 더 많은 에러가 쏱아져서 괴롭겠지만 'use strict' 사용이 기초적인 여러 가지 실수를 막아주는데 많은 도움이 됩니다.