javaScript/js.strictMode

엄격모드

1. strict mode

ES5부터 strict mode가 추가되었다.
자바스크립트 언어의 문법을 보다 엄격히 적용하여 기존에 무시되던 오류를 발생시킬 가능성이 높거나 자바스크립트 엔진의 최적화 작업에 문제를 일으킬 수 있는 코드에 대해 명시적 에러를 발생시킨다.

ESlint같은 도구로 비슷한 효과를 얻을 수 있다.
린트는 정적분석 기능을 통해 소스코드를 실행하기 전에 소스 코드를 스캔하여 문법적 오류만이 아니라 잠재적 오류까지 찾아내고 오류의 이유도 리포팅 해준다.

2. strict mode의 적용

  • strict mode를 적용하려면 전역의 선두 또는 함수 몸체 선두에 ‘use strict’;를 추가
    전역 선두에 추가하면 스크립트 전체에 적용된다.

  • 함수 몸체의 선두에 추가하면 해당 함수와 중첩된 내부 함수에 strict mode 적용

  • 코드의 선두에 strict mode를 위치시키지 않으면 작동하지않는다 (에러발생시키지않음)

    3. 전역에 strict mode 적용은 no

  • 스크립트 단위로 적용된 strict mode는 다른 스크립트에 영향을 주지않고 자신의 스크립트에 한정되어 적용한다.

  • strict mode, non-strict mode를 혼용하면 오류를 발생시킬 수 있음

  • 즉시 실행 함수로 스크립트 전체를 감싸서 스코프를 구분하고, 함수 선두에 strict mode적용

4. 함수 단위로 strict mode를 적용하는 것도 no

strict mode가 적용된 함수가 참조할 함수 외부의 컨텍스트에 strict mode를 적용하지 않는다면 문제를 발생시킨다.

5. strict mode가 발생시키는 에러

5.1 암묵적 전역

선언하지 않는 변수를 참조하면 ReferenceError가 발생

1
2
3
4
5
6
(function () {
'use strict';

x = 1;
console.log(x); // ReferenceError x is not defined
}());

5.2 변수, 함수, 매개변수의 삭제

delete 연산자로 변수, 함수, 매개변수를 삭제하면 SyntaxError가 발생

5.3 매개변수 이름의 중복

중복된 함수 매겨변수 이름을 사용하면 SyntaxError가 발생

1
2
3
4
5
6
7
8
9
(function () {
'use strict';

//SyntaxError: Duplicate parameter name not allowed in this context
function foo(x, x) {
return x + x;
}
console.log(foo(1, 2));
}());

5.4 with문의 사용

with문을 사용하면 SyntaxError 발생

6. strict mode 적용에 의한 변화

6.1 알반 함수의 this

strict mode에서 함수를 일반 함수로서 호출하면 this에 undefined가 바인딩된다.
생성자 함수가 아닌 일반 함수 내부에서는 this를 사용할 필요가 없기때문이다.

6.2 arguments 객체

strict mode에서는 매개변수에 전달된 인수를 재할당하여 변경하여도 arguments 객체에 반영되지 않는다.

You forgot to set the qrcode for Alipay. Please set it in _config.yml.
You forgot to set the qrcode for Wechat. Please set it in _config.yml.
You forgot to set the business and currency_code for Paypal. Please set it in _config.yml.
You forgot to set the url Patreon. Please set it in _config.yml.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×