JavaScript Tutorial.54

ansunny1170·2022년 1월 7일
0
post-thumbnail

JS Use Strict

"엄격한 사용(use strict)"; JavaScript 코드가 "strict mode"에서 실행되어야 함을 정의한다.

The "use strict" Directive

"use strict" 지시문은 ECMAScript 버전 5의 새로운 기능이다.

이것은 문(statemeent)이 아니라 이전 버전의 JavaScript에서 무시되는 리터럴 표현식이다.

"use strict"의 목적은 코드가 "strict mode"에서 실행되어야 함을 나타내는 것이다.

strict mode에서는 예를 들어, 선언되지 않은 변수를 사용할 수 없다.

모든 프로그램에서 strict mode를 사용할 수 있다. 선언되지 않은 변수를 사용하지 못하도록 하는 것과 같이 보다 깔끔한 코드를 작성하는 데 도움이 된다.

"use strict"는 문자열일 뿐이므로 IE 9는 이해하지 못하더라도 오류를 발생시키지 않는다.

Declaring Strict Mode

strict mode는 스크립트나 함수의 시작 부분에 "use strict"를 추가하여 선언된다.

스크립트 시작 부분에 선언되며 전역 범위를 갖는다(이후 스크립트의 모든 코드는 엄격 모드에서 실행됨).

함수 내에서 따로 선언 할 수 있고, 로컬 범위에서만 작동한다.(함수 내부의 코드만 엄격 모드에 있음).

The "use strict"; Syntax

strict mode를 선언하기 위한 구문은 이전 버전의 JavaScript와 호환되도록 설계되었다.

JavaScript 프로그램에서 숫자 리터럴(4 + 5;) 또는 문자열 리터럴("John Doe";)을 컴파일하면 부작용이 없다. 단순히 존재하지 않는 변수로 컴파일되고 죽는다.

따라서 "use strict"; 의미를 "이해하는" 새로운 컴파일러에게만 중요한 것이다.

Why Strict Mode?

strict mode를 사용하면 "보안" JavaScript를 더 쉽게 작성할 수 있다.

Strict mode는 이전에 허용된 "잘못된 구문(bad syntax)"을 실제 오류로 변경한다.

예를 들어, 일반 JavaScript에서 변수 이름을 잘못 입력하면 새 전역 변수가 생성되는데, strict mode에서는 오류가 발생하여 개발자 실수로 전역 변수를 생성할 수가 없다.

일반 JavaScript에서 개발자는 쓰기 불가능한 속성에 값을 할당하는 오류 피드백을 받지 않는다.

strict mode에서 non-writable 속성, getter-only 속성, non-existing 속성, non-existing 변수 또는 non-existing 객체에 대한 할당은 오류를 발생시킨다.

Not Allowed in Strict Mode

선언하지 않고 변수를 사용하는 것은 허용되지 않는다.

object 역시 변수다.

선언하지 않고 객체를 사용하는 것은 허용되지 않는다.

변수(또는 개체) 삭제는 허용되지 않는다.

함수 삭제는 허용되지 않는다.

매개변수 이름 복제는 허용되지 않는다.

8진수 숫자 리터럴은 허용되지 않는다.

8진 이스케이프 문자는 허용되지 않는다.

잘이해가 안가는 내용
읽기 전용 속성에 대한 쓰기는 허용되지 않는다.

<!DOCTYPE html>
<html>
<body>

<h2>With "use strict":</h2>
<h3>Writing to a read-only property is not allowed.</h3>

<p>Activate debugging in your browser (F12) to see the error report.</p>

<script>
"use strict";
const obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});

obj.x = 3.14;   // This will cause an error
</script>

</body>
</html>

get-only 속성에 대한 쓰기는 허용되지 않는다.

<!DOCTYPE html>
<html>
<body>

<h2>With "use strict":</h2>
<h3>Writing to a get-only property is not allowed.</h3>

<p>Activate debugging in your browser (F12) to see the error report.</p>

<script>
"use strict";
const obj = {get x() {return 0} };

obj.x = 3.14;   // This will cause an error
</script>

</body>
</html>

삭제할 수 없는 속성은 삭제할 수 없다.

eval이라는 단어는 변수로 사용할 수 없다.

arguments라는 단어는 변수로 사용할 수 없다.

with 문은 허용되지 않습니다.

보안상의 이유로 eval()은 호출된 범위에서 변수를 생성할 수 없다.

<!DOCTYPE html>
<html>
<body>

<h2>With "use strict":</h2>
<h3>For security reasons, eval() is not allowed to create variables in the scope from which it was called.</h3>

<p>Activate debugging in your browser (F12) to see the error report.</p>

<script>
"use strict";
eval ("var x = 2");
alert (x);      // This will cause an error 
</script>

</body>
</html>

함수의 this 키워드는 strict mode에서 다르게 작동한다.

this 키워드는 함수를 호출한 객체를 참조한다.

object가 지정되지 않은 경우 엄격 모드의 함수는 undefined을 반환하고 일반 모드의 함수는 전역 object(window)를 반환한다.

Future Proof!

향후 JavaScript 버전용으로 예약된 키워드는 stirct mode에서 변수 이름으로 사용할 수 없다.

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield

Watch Out!

"use strict" 지시어는 스크립트나 함수의 시작 부분에서만 인식된다.

profile
공정 설비 개발/연구원에서 웹 서비스 개발자로 경력 이전하였습니다. Node.js 백엔드 기반 풀스택 개발자를 목표로 하고 있습니다.

0개의 댓글