[Javascript] use strict란?

use strict
암묵적인 "느슨한 모드(sloppy mode)"를 해제하고,
명시적인 "엄격 모드(Strict Mode)"를 사용하는 방법이다.

ECMAScript 5부터 추가된 use strict는 JS(자바스크립트)의 제한된 버전을 선택함으로써 런타임시, JS 코드에 대하여 향후 버전의 ECMAScript에서 사용될 수 있는 일부 구문의 제외하는 등 보다 엄격한 parsingerror handling을 자발적으로 시행하도록 적용함을써 일반적인 코딩 실수나 안전하지 않은 동작을 포착한다.

Strict 모드에서는 일반적인 JavaScript의 의미에 몇 가지를 변경한다.

  1. JavaScript오류는 아니지만 함정이 될 어떤 일을 오류가 발생하도록 변경하여 제거한다. 즉, 코드의 문제를 더 빨리 알리고 소스로 더 빨리 안내하므로, 결과적으로 디버깅이 쉬워진다.

  2. JavaScript 엔진의 최적화 처리를 어렵게 만드는 오류를 수정한다.

  3. 미래의 ECMAScript로 정의 될 예정 구문을 금지하여 발생 가능한 에러를 예방한다.

x = 3.14;

예시와 같이 암시적 변수 선언과 할당이 된 코드를 실행하였을 때 use strict를 사용하지 않은 상태에서는 문제없이 실행된다.

이 모드를 사용하려면 코드 맨 앞(해당 스코프의 시작)에 use strict 행을 쓰면 된다.

'use strict`; // "use strict" (세미콜론 여부 상관 없음)

이렇게 명시하면 전역 스코프에 스트릭트 모드가 명시된 것이다.
만일 함수안에서 'use strict'를 사용하면 해당 함수만 스트릭트 모드로 실행된다.

스트릭트 모드를 사용함으로써 이제는 error가 발생되고 exceptions이 throw된다.

'use strict'
x = 3.14; // Uncaught ReferenceEffor : x is not defined

use strict가 적용이 안되는 케이스가 몇 가지 있으니 주의하도록 하자.

  1. 변수를 use strict 시작행 이전에 작성할 경우
x = 3.14;
'use strict';
  1. 단순히 { }를 생성한 임의의 블록 구문일 경우
{
	'use strict';
    x = 3.14;
}
  1. 블록 스코프 내부에서
for(ii=0; ii<1; ii++){
	'use strict';
    x = 3.14;
}

strict mode의 주요 이점 중 일부는 다음과 같다.

  1. 우발적인 global을 방지한다.
    엄격 모드가 없으면, 선언되지 않은 변수에 값을 할당시에 해당 이름의 전역 변수가 자동으로 생성된다. 이것은 JS에서 가장 일반적인 오류 중 하나로서 strict 모드에서는 그렇게하면 오류가 발생한다.

  2. this coercion을 제거한다.
    strict 모드가 없으면 this의 null 또는 undefined 값에 대한 참고가 자동으로 전역에 강제된다.
    이로 인해 많은 헤드 페이크(headfakes)와 풀 아웃 헤어(pull-out-your-hair) 종류의 버그가 발생할 수 있다. strict 모드에서 this를 null 도는 undefined 값으로 참조하면 오류가 발생한다.

  3. 중복(duplicate) 매개 변수 값을 허용하지 않는다.
    strict 모드는 함수에 대해 이름이 지정된 중복 인수를 감지하면 오류를 발생시킨다.

function foo (val1, val2, val1) {}; //undefined

'use strict'
function foo (val1, val2, val1) {}; //Uncaught SyntaxError : Duplicate parameter name not allowed in this context
  1. eval()을 더 안전하게 만든다.
    eval()이 strict 모드와 non-strict 모드에서 동작하는 방식에는 약간의 차이가 있다.
    핵심은 strict 모드에서 eval() 문 안에 선언된 변수 및 함수는 포함되는 scope에 생성되지 않는다는 것이다.

  2. 유효하지 않은 delete 사용 시 error가 발생한다.
    주로 객체에서 속성을 제거하는데 사용되는 delete 연산자는 객체의 non-configurable(구성할 수 없는) 속성(propperty)에 사용할 수 없다.




최신 웹사이트는 대부분 다양한 스크립트를 불러와서 사용하므로 전역 스코프에서 스트릭트 모드를 사용하면 불러온 스크립트 전체에 스트릭트 모드가 강제된다.

모든 스크립트가 스트릭트 모드에서 정확히 동작한다면 좋겠지만 일반적으로는 그러한 호환성은 바라기 어려운 것이므로 결론적으로 전역 스코프에서 스트릭트 모드를 사용하지 않는 편이 좋다.

그러나 작성하는 함수 하나하나마다 전부 'use strict'를 붙이는 것은 너무 귀찮으니 코드 전체를 즉시 실행되는 함수 하나안에다가 감싸면 된다.

(function() {
'use strict';
//코드를 전부 이 안에 작성한다.
// 이 코드는 스트릭트 모드로 동작하지만,
// 이코드와 함께 동작하는 다른 스크립트에는 영향을 받지 않는다.
})();

다만 strict mode function 혹은 arguments objects 에서는 'caller', 'callee', 'arguments' properties를 접근할 수 없다.

참고 출처 : https://m.blog.naver.com/on21life/221654555798

좋은 웹페이지 즐겨찾기