[JavaScript] strict Mode(엄격모드) 라고 아십니까?

2021. 7. 6. 22:47front-end/JavaScript

 

Javascript 공식적인 용어는 아니지만, 느슨한 모드(sloppy mode) 라고 부르기도 한다.

엄격 모드는 단지 부분적인 것이 아니며, 이것은 고의적으로 일반 코드와  다른 시멘틱을 가지고 있다. 엄격모드는 평범한 Javascript 시멘틱스에 몇가지 변경이 일어나게 한다.

1. 기존에는 조용히 무시되던 에러들을 throwing 한다.

2. Javascript 엔진의 최적화 작업을 어렵게 만드는 실수들을 바로 잡는다. 가끔씩 엄격모드의코드는 비-엄격 모드의 동일한 코드보다 더 빨리 작동하도록 만들어진다.

3. 엄격모드는 ECMAScript 의 차기 버전들에서 정의 될 문법을 금지함.스크립트 엄격 모드 엄격모드를 전체 스크립트에 적용하기 위해,

정확한 구문 "use strict";(또는 'use strict';) 을 다른 구문 작성 전에 삽입

'use strict';

var v = "Hi! I'm a strict mode script!";

 

엄격모드 적용하기!

엄격모드는 전체 스크립트 또는 부분 함수에 적용가능하다. 단, {} 괄호로 묶여진 블럭문에는 적용되지 않는다. 컨텍스트와 같은곳에 적용을 시도하면 동작하지 않는다. eval 코드, Function 코드, 이벤트 핸들러 속성, WindowTimers.setTimeout() 과 연관된 함수들에 전달된 문자열이 전체 스크립트이며 여기에서 엄격모드가 예상대로 동작한다. 

실수로 에러를 내는 것..

엄격한 모드는 일부 이전에 허용되었던 실수를 오류로 바꿔 놓습니다. 자바 스크립트는 초보 개발자에게 쉬운 것이 되도록 설계되었으며, 때로는 오류를 일으킬만한  동작을 에러없이 시행한다. 때때로 이것은 즉각적인 문제를 해결하지만, 때때로 이것은 더 심각한 문제를 만들어 낸다. 엄격한 모드는 이러한 실수를 오류로 처리해서 그것을 발견하고 즉시 고칠 수 있도록 한다.

 

첫째로, 엄격모드는 실수로 글로벌 변수를 생성하는 것을 불가능하게 만든다.

일반적인 JavaScript에서 변수를 잘못 입력하면 전역 객체에 대한 새 속성이 만들어지고 그대로 "동작" (미래의 오류가 발생할 수 있음: modern 자바 스크립트처럼) 한다.

전역 변수를 생성하는 할당은 엄격 모드에선 오류를 발생시킨다.

 

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

 

 

두번째, 예외를 발생시키는 실패를 조용히 넘어가는 대신 작업을 만든다. 엄격모드에서는 NaN에 할당하는 것은 예외 발생..쓸 수 없는 프로퍼티가 할당이 되면 TypeError가 발생하는 것을 볼 수 있다.

 

셋째로, 엄격 모드는 삭제할 수 없는 프로퍼티를 삭제하려할 때 예외를 발생

"use strict";
delete Object.prototype; // TypeError 발생

그 외에,,,

 

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

 

function sum(a, a, c){ // !!! 구문 에러
  "use strict";
  return a + b + c; // 코드가 실행되면 잘못된 것임
}

 

공식문서는 아래 ⬇