Pko

Strict mode & Sloppy mode 본문

language/js

Strict mode & Sloppy mode

pastko 2021. 7. 20. 02:32

Strict mode

 

 

자바 스크립트는 초보 개발자에게 쉬운 것이 되도록 설계되었으며, 때로는 오류를 일으킬만한 동작을 에러없이 동작한다. 그렇기 때문에 일부는 즉각적인 문제를 해결 할수 있지만, 일부는 더 심각한 문제를 발생기키게 된다.

이러한 상태를 공식적인 명칭은 아니지만 "느슨한 모드(sloppy mode)"라 불린다.

 

엄격한 모드는 이러한 실수를 오류로 처리해서 그것을 발견하고 즉시 고칠 수 있도록 오류를 발생시키게 되는 것이다.

"엄격한 모드"(Strict mode)  라 불리며 JavaScript의 ES5 이전의 암묵적인 "느슨한 모드(sloppy mode)" 를 해제하기 위한 방법이다

 

엄격한 모드는 구문과 런타임 동작을 모두 변경하며 여러가지의 상황이 바뀌게 된다. 변환 실수를 오류로 해석하거나(문법 오류 또는 런타임에 오류 발생), 특정 이름의 특정 용도에 대한 특정 변수를 계산하는 방법을 단순화하며,  eval 과 arguments 를 단순화하고, "안전한 "자바 스크립트를 작성하도록 돕는다.

 

 

사용법은 간단하다. 스크립트 작성전 use strict라는 문구를 삽입해주면 엄격모드로 동작하게 된다.

// 엄격 모드 구문
'use strict';
var v = "Hi!  Hello Word!";

우리는 엄격모드에서 기본적으로 구문의 실수를 오류로 처리해서 그것을 발견하고 즉시 고칠 수 있도록 해주는 7가지 상황을 알아보려한다.

 

 

 

- 첫째

   실수로 글로벌 변수를 생성하는 것을 불가능하게 만든다. 일반적인 JavaScript에서 변수를 잘못 입력하면 전역 객체에 대한 새 속성이 만들어지고 그대로 "동작" 한다.  전역 변수를 생성하는 할당은 엄격 모드에선 오류를 발생시킨다.

 

 

 

- 둘째

    예외를 발생시키는 실패를 조용히 넘어가는 대신 오류를 발생시킨다. 예를 들어, NaN 은 쓸 수 없는 전역 변수입니다. NaN 에 할당하는 일반적인 코드는 아무 것도 하지 않고 개발자도 아무런 실패 피드백을 받지 않는다. 엄격 모드에서 NaN 에 할당하는 것은 예외를 발생 시킨다.  이전에 조용히 넘어가는 모든 실패에 대해 (쓸 수 없는 전역 또는 프로퍼티에 할당, getter-only 프로퍼티에 할당, 확장 불가 객체에 새 프로퍼티 할당) 예외를 발생시키게 된다.

 

 

 

- 셋째

    삭제할 수 없는 프로퍼티를 삭제하려할 때 예외를 발생시킵니다(시도가 어떤 효과도 없을 때). 예를 들어 Object.prototype를 삭제한다 던가 하는 작업에서 오류를 발생시킨다. 

 

 

 

- 넷째

    객체 리터럴의 모든 프로퍼티의 이름이 유니크하도록 요구한다.  프로퍼티의 생성하고  같은 이름에 다른 프로퍼티를 생성하게 되면 나중에 정해진 프로퍼티 이름으로 중복되게 되지만 마지막 인스턴스만 변경했기 때문에 코드를 수정하여 마지막 인스턴스를 변경하는 것 이외의 속성 값을 변경하면 버그 발생하게 된다 그렇기 때문에 이름을 중복하는 것은 구문 오류를 발생시킨다.

 

 

 

- 다섯째

   유니크한 함수 파라미터 이름을 요구한다. 일반 코드에서는 마지막으로 중복된 인수가 이전에 지정된 인수를 숨긴다. 이러한 이전의 인수들은 arguments[i] 를 통해 여전히 남아 있을 수 있으므로, 완전히 접근 불가한 것이 아닙니다. 여전히, 이런 숨김 처리는 이치에 맞지 않으며 원했던 것이 아닐 수 있습니다(예를 들면 오타를 숨길 수도 있습니다). 따라서 엄격 모드에서는 중복 인수명은 구문 에러입니다.

 

 

- 여섯째

   ECMAScript 5 에서의 엄격 모드는 8진 구문을 금지합니다. 8진 구문은 ES5의 문법이 아니지만, 모든 브라우저에서 앞에 0을 붙여 지원됩니다(0644 === 420 와 "\045" === "%"). ECMAScript 2015 에서는 접두사 "0o"를 붙여 8진수를 지원합니다.

 

 

- 일곱째

    ECMAScript 6 의 엄격모드는 primitive 값에 프로퍼티를 설정하는 것을 금지 한다. 엄격모드가 아닐 때에는 프로퍼티 설정이 간단하게 무시되지만(no-op), 엄격모드에서는 TypeError 를 발생 시킨다.

 

 

 

 

 

 

- 참조

 

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Strict_mode

'language > js' 카테고리의 다른 글

js - Array  (0) 2021.07.06
js 호이스팅  (0) 2021.07.03
js - 클로저  (0) 2021.07.01
js 자료형  (0) 2021.07.01
js - 조건문  (0) 2021.06.15