Javascript는 꽤 오랫동안 호환성 이슈 없이 발전해 왔다. 기존의 기능을 변경하지 않으면서 새로운 기능들이 추가되었던 것이다.
덕분에 기존에 작성한 코드는 절대 망가지지 않는다는 장점이 있었다. 하지만 Javascript 창시자들이 했던 실수나 불완전한 결정이 언어 안에 그대로 박제되어 있다는 단점도 생길 수밖에 없었다.
이런 상황은 ECMAScript5(ES5)가 등장하기 전까지 지속되었다. 그러나 ES5에서는 새로운 기능이 추가되고 기존 기능 중 일부가 변경되었다. 그리고 기존 기능을 변경하였기 때문에 하위 호환성 문제가 생기게 되었다. 그리하여 변경사항 대부분은 ES5의 기본 모드에선 활성화되지 않도록 설계되었다.
대신 use strict라는 특별한 지시자를 사용해 엄격 모드(strict mode)를 활성화 했을 경우에만 이 변경 사항이 활성화되도록 했다.
use strict
"use strict" 혹은 'use strict'는 단순한 문자열처럼 보이지만 이 지시자가 스크립트 최상단에 오면 스크립트 전체가 모던한 방식으로 동작하게 된다.
"use strict";
// 이 코드는 모던한 방식으로 실행된다.
...
"use strict"는 스크립트 최상단이 아닌 함수 본문 맨 앞에 올 수도 있는데, 이렇게 하면 해당 함수만 엄격 모드로 실행된다. 하지만 대체로 엄격 모드는 스크립트 전체에 적용한다.
"use strict"는 반드시 스크립트 최상단에 위치시켜야 한다. 그렇지 않으면 엄격 모드가 활성화되지 않을 수도 있다. 따라서 다음 예시에서는 엄격 모드가 활성화되지 않는다.
alert("blahblah");
// 아래의 "use strict"는 스크립트 상단에 위치하지 않으므로 무시된다.
"use strict";
// 엄격 모드가 활성화되지 않음.
"use strict"의 위에는 주석만 사용할 수 있다.
use strict를 취소할 방법은 없다. Javascript 엔진을 use strict를 사용하기 이전으로 되돌리는 지시자 같은 건 존재하지 않는다. 따라서 일단 엄격 모드가 적용되면 다시 되돌릴 방법은 없는 것이다.
Browser console
개발한 기능을 테스트하기 위해 브라우저 콘솔을 사용하는 경우 기본적으로 use strict가 적용되어 있지 않다. use strict에 영향을 받는 경우라면 개발자는 기대하지 않았던 결과를 얻을 수 있기 때문이다.
그렇다면 어떻게 해야 console에서 use strict를 사용할 수 있을까?
'use strict’를 입력한 후 Shift+Enter로 줄 바꿈해 원하는 스크립트를 입력하면 된다.
'use strict' // Shift+Enter로 줄바꿈
// ... 테스트하려는 코드 입력
// Enter로 실행
이 기능은 Firefox와 Chrome 같은 브라우저에서 대부분 사용 가능하다. 브라우저가 오래 되어 콘솔 창에 use strict 입력이 불가능할 경우, use strict를 적용하는 가장 확실한 방법은 아래와 같이 코드를 래퍼로 감싸는 것이다.
(function() {
'use strict';
// ...테스트하려는 코드...
})()
Browser console 내에서의 use strict 사용 예시
변수는 대개 정의되어 있어야 사용할 수 있다. 그러나 이전에는 단순히 값을 할당해 변수를 생성하는 것이 가능했다.
use strict를 쓰지 않으면 위의 예시(a)와 같이 과거 스크립트와의 호환성을 유지할 수 있기 때문에 여전히 이 방식을 사용할 수 있다.
그러나 이렇게 변수를 생성하는 것은 엄격 모드에서 에러를 발생시킨다(b).
'use strict'를 꼭 사용해야 할까?
당연히 사용해야 한다고 생각할 수도 있지만 꼭 그렇지만은 않다.
모던 자바스크립트는 클래스와 모듈이라 불리는 진일보한 구조를 제공하는데, 이 둘을 사용하면 use strict가 자동으로 적용된다. 따라서 이 둘을 사용하고 있다면 스크립트에 "use strict"를 붙일 필요가 없다.
참고자료
ko.javascript.info/strict-mode
'Javascript > Javascript' 카테고리의 다른 글
[Javascript] 이벤트 버블링 (1) | 2024.07.30 |
---|---|
[Javascript] 형변환(1) - 명시적 형변환 (0) | 2021.04.09 |
[Javascript] typeof 연산자 (0) | 2021.04.08 |
[Javascript] 자료형 (0) | 2021.04.08 |
[Javascript] Singleton Pattern(싱글톤 패턴) (0) | 2020.10.13 |