Javascript Use Strict
이 포스팅의 원본 문서는 이곳입니다. 이 포스팅은 원본 문서를 한글로 번역한 것임을 밝힙니다. 중간중간 의역이 있습니다. 유의 부탁드립니다. :)
Define "use strict"
자바스크립트에서 use strict란 선언된 이후의 자바스크립트 코드들을 strict mode로 실행한다는 뜻이다.
Syntax "use strict"
use strict 구문은 자바스크립트 1.8.5(ECMAScript version 5)버전에서 새롭게 추가 되었다. 이 구문은 상태(statement)가 아니고 문자 표현식(literal expression)이다. 자바스크립트의 이전 버전에서는 무시된다.
use strict 구문의 목적은 선언 이후 자바스크립트 코드들을 strict mode로 실행될 것임을 표시한다. 예를 들어 strict mode는 사용자가 선언되지 않은 변수를 사용하는 것을 막는다.
현재 strict mode를 지원하는 브라우저는 다음과 같다.
- IE 10
- Firefox 4
- Chrome 13
- Safari 5.1
- Opera 12
Way for Define Strict Mode
엄격한 문법Strict Mode의 선언 방법은 자바스크립트 파일 또는 자바스크립트 함수 시작 위치에 "use strict"; 를 더하는 것이다.
자바스크립트 파일의 시작 위치에 선언하는 것은 전역 범위global scope를 가진다. 이것은 모든 자바스크립트 코드를 "엄격한 문법"을 사용하겠다는 것이다.
자바스크립트 함수의 내부에 선언하는 것은 지역 범위local scope를 가진다. 이것은 함수 내의 코드만을 엄격한 문법을 적용 시킨다.
/* 전역 선언(Global declaration) */ "use strict"; x = 3.14; // 이 코드는 오류가 난다. myFunction(); // 이 코드 또한 오류가 난다. function myFunction() { x = 3.14; }
/* 지역 선언(Local declaration) */ x = 3.14; // 이 코드는 오류가 나지 않는다. myFunction(); // 이 코드는 오류가 난다. function myFunction() { "use strict"; x = 3.14; }
주의사항
use strict 선언은 반드시 스크립트 또는 함수의 처음 부분에 구성 되어야 한다.
Syntax "use strict";
엄격한 문법 선언을 위한 문법은 옛날 버전의 자바스크립트에도 호환될 수 있게 디자인 되었다.
자바스크립트 프로그램 내에서 숫자형 문자numeric literal, 예를 들자면 4 + 5;같은 것이나 또는 문자열 문자string literal 예를 들자면 "JDM"; 같은 코드를 컴파일하는데 부작용side effects을 가지지 않는다. 이것은 단순하게 익명 변수로 컴파일하고 무시한다.
그래서 "use strict"; 구문은 이것을 이해할 수 있는 새로운 컴파일러들만이 처리할 것이다
Why I use "Strict Mode"?
엄격한 문법은 자바스크립트 코드를 안전하게 만드는 것을 쉽게 할 수 있도록 만든다.
엄격한 문법은 오류가 날만한 나쁜 문법bad syntax을 실제 오류real errors로 바꿔준다.
예를 들어 일반적인 자바스크립트에선 변수를 사용할 때 단순한 실수로 오탈자가 생기면mistyping 이것을 오류가 아닌 새로운 전역 변수global variable로 만든다. 하지만 엄격한 문법에서는 이것을 오류라고 표시하고 전역 변수를 갑작스럽게 만들어내는 것을 불가능하게 만든다.
또한 일반적인 자바스크립트에서 개발자가 쓰기 불가 속성non-writable properties에 새로운 값을 집어넣어도 피드백을 주지 않아 이것이 오류라는 것을 인지 할 수 없다.
그러나 엄격한 문법 내에선 쓰기 불가 속성non-writable property, 읽기 전용 속성getter-only property, 존재하지 않는 속성non-existing property, 존재하지 않는 변수non-existing variable 또는 존재하지 않는 객체non-existing object까지 전부 오류로 인식한다.
Not allowed code in "Strict Mode"
변수를 사용할 때 선언하지 않으면 사용할 수 없다.
"use strict"; x = 3.14; // 이 코드는 오류가 난다. x가 선언되지 않았기 때문이다.
변수variable, 함수function, 또는 인자argument를 삭제하는 것은 허용 하지 않는다.
"use strict"; x = 3.14; delete x; // 이 코드는 오류가 난다.
같은 속성 내에서 두번 정의 하는 것은 허용 하지 않는다.
"use strict"; var x = {p1:10, p1:20}; // 이 코드는 오류가 난다.
중복된 파라미터 이름을 선언할 수 없다.
"use strict"; function x(p1, p1) {}; // 이 코드는 오류가 난다.
8진수 숫자형 문자Octal numeric literals와 탈출escape 문자는 허용 되지 않는다.
"use strict"; var x = 010; // 이 코드는 오류가 난다. var y = \010; // 이 코드는 오류가 난다.
읽기 전용 속성read-only property에 값을 새로 쓰는 것은 허용하지 않는다.
"use strict"; var obj = {}; obj.defineProperty(obj, "x", {value:0, writable:false}); obj.x = 3.14; // 이 코드는 오류가 난다.
읽기 전용 속성get-only property에 값을 새로 쓰는 것은 허용하지 않는다.
"use strict"; var obj = { get x(){ return 0; } }; obj.x = 3.14; // 이 코드는 오류가 난다.
삭제 불가능 속성undeletable property을 삭제하는 것은 허용하지 않는다.
"use strict"; delete Object.prototype; // 이 코드는 오류가 난다.
변수 명으로 eval과 arguments를 사용할 수 없다.
"use strict"; var eval = 3.14; // 이 코드는 오류가 난다. var arguments = 3.14; // 이 코드는 오류가 난다.
with 구문statement을 사용할 수 없다.
"use strict"; with (Math){x = cos(2)}; // 이 코드는 오류가 난다.
보안적인 이유로 eval() 함수를 써서 만든 새로운 변수들은 호출 할 수 없다.
"use strict"; eval ("var x = 2"); alert (x) // 이 코드는 오류가 난다.
마지막으로, 함수function 내에서 f() 같은 함수를 호출하면 이 값은 전역 객체global object지만 엄격한 문법 내에서는 undefined 값을 가진다.