JavaScript strict 모드

"use strict"; JavaScript 코드가 "strict 모드"로 실행되어야 한다고 정의합니다.

"use strict" 명령어

"use strict" 는 JavaScript 1.8.5에서 새로운 명령어(ECMAScript 버전 5)입니다.

이는 하나의 문장이 아니라 텍스트 표현식입니다. 더 오래된 버전의 JavaScript는 이를 무시합니다.

"use strict"; 의 역할은 JavaScript 코드가 "strict 모드"로 실행되어야 한다고 지시합니다.

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

다음 버전의 브라우저가 strict 모드를 지원합니다:

  • 10 버전 이상의 IE
  • 4 버전 이상의 Firefox
  • 13 버전 이상의 Chrome
  • 5.1 버전 이상의 Safari
  • 12 버전 이상의 Opera

strict 모드를 선언합니다

스크립트나 함수의 시작 부분에 추가하여 "use strict"; strict 모드를 선언하려면

스크립트의 시작 부분에서 선언하면 전역 범위를 가집니다(스크립트 내의 모든 코드가 strict 모드로 실행됩니다):

예제

"use strict";
x = 3.14;       // 이는 오류를 일으킵니다. x는 아직 선언되지 않았기 때문입니다

직접 시도해 보세요

예제

"use strict";
myFunction();
function myFunction() {
     y = 3.14;   // 이는 오류를 일으킵니다. y는 아직 선언되지 않았기 때문입니다
}

직접 시도해 보세요

함수 내에서 strict 모드를 선언하면 지역 범위를 가집니다(함수 내의 모든 코드가 strict 모드로 실행됩니다):

x = 3.14;       // 이는 오류를 일으키지 않습니다
myFunction();
function myFunction() {
	"use strict";
	 y = 3.14;   // 이는 오류를 일으킵니다
}

직접 시도해 보세요

"use strict" 문법

strict 모드의 문법은 더 오래된 버전의 JavaScript와 호환되게 설계되었습니다.

JavaScript 프로그램에서 숫자 텍스트(예: 4+5)나 문자열 텍스트("Bill Gates")를 컴파일하면 부정적인 영향이 없습니다. 그냥 존재하지 않는 변수로 컴파일되고 사라집니다.

모든 "use strict"; 새로운 컴파일러만이 의미를 이해할 수 있습니다.

왜 strict 모드를 사용해야 합니까?

strict 모드는 "安全的" JavaScript를 쉽게 작성할 수 있게 합니다。

strict 모드는 이전에 허용된 "bad syntax"를 실제 오류로 변환합니다。

예를 들어, 일반 JavaScript에서 변수 이름을 잘못 입력하면 새로운 전역 변수가 생성됩니다. strict 모드에서는 이러한 행동이 오류로 처리되어 전역 변수를 무의식적으로 생성할 수 없습니다。

일반 JavaScript에서, 읽을 수 없는 속성에 값을 할당하면 개발자는 어떤 오류 피드백도 받지 못합니다。

strict 모드에서, 읽을 수 없는, 읽기 전용, 존재하지 않는 속성에 값을 할당하거나, 존재하지 않는 변수나 객체에 값을 할당하면 오류가 발생합니다。

strict 모드에서 허용되지 않는 사항

변수를 사용할 때 변수를 선언하지 않았다면 사용하는 것은 허용되지 않습니다:

"use strict";
x = 3.14;                // 이는 오류를 일으킵니다

직접 시도해 보세요

객체는 변수입니다

객체를 사용할 때 객체를 선언하지 않았다면 허용되지 않습니다:

"use strict";
x = {p1:10, p2:20};      // 이는 오류를 일으킵니다

직접 시도해 보세요

변수(또는 객체)를 제거하는 것은 허용되지 않습니다:

"use strict";
var x = 3.14;
delete x;                // 이는 오류를 일으킵니다

직접 시도해 보세요

함수를 제거하는 것은 허용되지 않습니다:

"use strict";
function x(p1, p2) {}; 
delete x;                 // 이는 오류를 일으킵니다

직접 시도해 보세요

중복된 매개변수 이름은 허용되지 않습니다:

"use strict";
function x(p1, p1) {};   // 이는 오류를 일으킵니다

직접 시도해 보세요

octal number literal은 허용되지 않습니다:

"use strict";
var x = 010;             // 이는 오류를 일으킵니다

직접 시도해 보세요

escape 문자는 허용되지 않습니다:

"use strict";
var x = \010;            // 이는 오류를 일으킵니다

직접 시도해 보세요

읽을 수 있는 속성에 쓰기는 허용되지 않습니다:

"use strict";
var obj = {};
Object.defineProperty(obj, "x", {value:0, writable:false});
obj.x = 3.14;            // 이는 오류를 일으킵니다

직접 시도해 보세요

읽을 수 있는 속성에 쓰기는 허용되지 않습니다:

"use strict";
var obj = {get x() {return 0} };
obj.x = 3.14;            // 이는 오류를 일으킵니다

직접 시도해 보세요

삭제할 수 없는 속성을 제거하는 것은 허용되지 않습니다:

"use strict";
delete Object.prototype; // 이는 오류를 일으킵니다

직접 시도해 보세요

문자 "eval"는 변수로 사용될 수 없습니다:

"use strict";
var eval = 3.14;         // 이는 오류를 일으킵니다

직접 시도해 보세요

문자 "arguments"는 변수로 사용될 수 없습니다:

"use strict";
var arguments = 3.14;    // 이를 통해 오류가 발생합니다

직접 시도해 보세요

with 사용할 수 없는 문장은 다음과 같습니다:

"use strict";
with (Math){x = cos(2)}; // 이를 통해 오류가 발생합니다

직접 시도해 보세요

보안상 고려하여 사용할 수 없습니다. eval() 호출된 스코프 내에서 변수를 생성합니다:

"use strict";
eval ("var x = 2");
alert (x);               // 이를 통해 오류가 발생합니다

직접 시도해 보세요

f()와 같은 함수 호출에서 this의 값은 전체 객체입니다. strict 모드에서는 지금 이 값이 되었습니다. undefined

미래의 보장

strict 모드에서 미래에 예약된 키워드를 사용할 수 없습니다. 그들은 다음과 같습니다:

  • implements
  • interface
  • let
  • package
  • private
  • protected
  • public
  • static
  • yield
"use strict";
var public = 1500;      // 이를 통해 오류가 발생합니다

직접 시도해 보세요

경고

"use strict" 지시문은 스크립트나 함수 내에서만 사용할 수 있습니다.시작인식되었습니다.