일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- gitops
- 윈도우키보드
- 디자인패턴
- http 413
- 컴포지트패턴
- m4 pro
- Intellij
- System Design
- AWS
- 배포 파이프라인
- Buffered channel
- intellij ide
- 사설 ip
- 티스토리챌린지
- Infra
- GoF
- UnBuffered channel
- Kubernetes
- elasticsearch
- golang
- goland
- GoF 디자인패턴
- go
- apollo router
- 오블완
- 대규모 시스템 설계
- body size
- Logrus
- notification system
- 배포 프로세스
- Today
- Total
Fall in IT.
use strict(Strict Mode)란? 본문
안녕하세요.
오늘은 Javascript에서 사용되는 "use strict" 란 무엇인지 알아보도록 하겠습니다.
use strict란?
- Strict Mode의 선언방식 입니다.
- 이 문구는 ES5부터 적용되는 키워드로, 안전한 코딩을 위한 하나의 가이드라인 입니다.
Strict Mode란?
- Strict Mode는 코드에 더 나은 오류 검사를 적용하는 방법입니다.
Strict Mode를 사용하면, 예를 들어 암시적으로 선언한 변수를 사용하거나 읽기 전용 속성에 값을 할당하거나 확장할 수 없는 개체에 속성을 추가할 수 없습니다. Strict Mode
는 ECMAScript 5 버전에 있는 새로운 기능으로써, 당신의 프로그램 또는 함수를 엄격한 운용 콘텍스트 안에서 실행시킬 수 있게끔 합니다. 이 엄격한 콘텍스트는 몇가지 액션들을 실행할 수 없도록 하며, 좀 더 많은 예외를 발생시킵니다.
Strict Mode의 장점
- 흔히 발생하는 코딩 실수를 잡아내서 예외를 발생 시킵니다.
- 상대적으로 안전하지 않은 액션이 발생하는 것을 방지합니다.
- 정확하게 고려되지 않은 기능들을 비활성화 시킵니다.
실제 적용 예제코드
- 전역 컨텍스트(함수 범위 밖)에서 선언되는 경우 프로그램의 모든 코드에 strict 모드가 적용됩니다.
- 함수 내에서 선언되는 경우 함수의 모든 코드에 strict 모드가 적용됩니다.
- MSDN의 내용을 복사한 자료 입니다. 더 자세한 내용은 링크를 참조 해주세요.
언어 요소
제한
오류
예제
변수
선언하지 않고 변수를 사용합니다.
SCRIPT5042: Strict 모드에서 변수가 정의되지 않았습니다.
testvar = 4;
읽기 전용 속성
읽기 전용 속성에 씁니다.
SCRIPT5045: Strict 모드에서는 읽기 전용 속성에 할당할 수 없습니다.
var testObj = Object.defineProperties({}, { prop1: { value: 10, writable: false // by default }, prop2: { get: function () { } } }); testObj.prop1 = 20; testObj.prop2 = 30;
확장할 수 없는 속성
extensible 특성이 false로 설정된 개체에 속성을 추가합니다.
SCRIPT5046: 확장할 수 없는 개체의 속성을 만들 수 없습니다.
var testObj = new Object(); Object.preventExtensions(testObj); testObj.name = "Bob";
delete
변수, 함수 또는 인수를 삭제합니다.
configurable 특성이 false로 설정된 속성을 삭제합니다.
SCRIPT1045: strict 모드에서는 <식>에 대해 delete를 호출할 수 없습니다.
var testvar = 15; function testFunc() {}; delete testvar; delete testFunc; Object.defineProperty(testObj, "testvar", { value: 10, configurable: false }); delete testObj.testvar;
속성 중복
개체 리터럴에서 속성을 두 번 이상 정의합니다.
SCRIPT1046: strict 모드에서는 한 속성을 여러 번 정의할 수 없습니다.
var testObj = { prop1: 10, prop2: 15, prop1: 20 };
매개 변수 이름 중복
함수에서 매개 변수 이름을 두 번 이상 사용합니다.
SCRIPT1038: strict 모드에서는 정식 매개 변수 이름이 중복될 수 없습니다.
function testFunc(param1, param1) { return 1; };
다음에 사용하기 위한 예약된 키워드
다음에 사용하기 위한 예약된 키워드를 변수 또는 함수 이름으로 사용합니다.
SCRIPT1050: 식별자에 대해 다음에 사용하기 위한 예약어를 잘못 사용했습니다.strict 모드에서는 식별자 이름이 예약됩니다.
implements
interface
package
private
protected
public
static
yield
8진수
숫자 리터럴에 8진수 값을 할당하거나 8진수 값에 이스케이프를 사용하려고 합니다.
SCRIPT1039: strict 모드에서는 8진수 숫자 리터럴 및 이스케이프 문자를 사용할 수 없습니다.
var testoctal = 010; var testescape = \010;
this
this의 값이 null또는 undefined인 경우 전역 개체로 변환되지 않습니다.
function testFunc() { return this; } var testvar = testFunc();
strict 모드가 아닌 경우 testvar 값은 전역 개체이지만 strict 모드에서 이 값은 undefined입니다.
식별자인 eval 문자열 "eval"은 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.
var eval = 10;
문 또는 블록 내에서 선언된 함수
문 또는 블록 내에서 함수를 선언할 수 없습니다.
SCRIPT1047: strict 모드에서는 함수 선언을 문이나 블록 내에 중첩할 수 없습니다.함수 선언은 함수 본문 내에 직접 나오거나 최상위 수준에만 나와야 합니다.
var arr = [1, 2, 3, 4, 5]; var index = null; for (index in arr) { function myFunc() {}; }
eval 함수 내에서 선언된 변수
변수가 eval 함수 내에서 선언되는 경우 해당 함수 밖에서 사용할 수 없습니다.
SCRIPT1041: strict 모드에서 'eval'을 잘못 사용했습니다.
eval("var testvar = 10"); testvar = 15;
간접 계산이 가능하지만 eval 함수 외부에 선언된 변수는 여전히 사용할 수 없습니다.
var indirectEval = eval; indirectEval("var testvar = 10;"); document.write(testVar);
이 코드는 "SCRIPT5009: 'testVar'이 정의되지 않았습니다" 오류를 발생시킵니다.
식별자인 Arguments 문자열 "arguments"는 식별자(변수 또는 함수 이름, 매개 변수 이름 등)로 사용할 수 없습니다.
SCRIPT1042: strict 모드에서 'arguments'를 잘못 사용했습니다.
var arguments = 10;
함수 내 arguments 로컬 arguments개체의 멤버 값을 변경할 수 없습니다.
function testArgs(oneArg) { arguments[0] = 20; }
strict 모드가 아닌 경우 arguments[0] 값을 변경하여 oneArg 매개 변수의 값을 변경할 수 있습니다. 그러면 oneArg 및 arguments[0]의 값이 모두 20이 됩니다.strict 모드에서 arguments[0] 값을 변경해도 oneArg 값에 영향을 주지 않습니다. arguments 개체가 로컬 복사본이기 때문입니다.
arguments.callee
허용되지 않습니다.
function (testInt) { if (testInt-- == 0) return; arguments.callee(testInt--); }
WITH
허용되지 않습니다.
SCRIPT1037: strict 모드에서는 'with' 문을 사용할 수 없습니다.
with (Math){ x = cos(3); y = tan(7); }
그렇다면, ES6에서는 Strict Mode가 필요할까?
- ES6에서는 디폴트가 Strict Mode이기 때문에 사용할 필요가 없습니다.
Not recommended to use “use strict” in ES6?(stack overflow link)
참고
- https://msdn.microsoft.com/library/br230269(v=vs.94).aspx
- https://johnresig.com/blog/ecmascript-5-strict-mode-json-and-more/
- https://www.w3schools.com/js/js_strict.asp
- http://blog.aliencube.org/ko/2014/01/02/reasons-behind-using-strict-mode-while-coding-javascript/
'프로그래밍언어 > Javascript & Typescript' 카테고리의 다른 글
Progressive Web App 간단히 알아보기 (0) | 2018.02.26 |
---|---|
lodash에 대해서 자주 사용하는 함수들 (0) | 2018.02.19 |
typescript에서 객체에 key/value 쌍을 추가하는 방법 (2) | 2017.12.26 |
Javascript 문자열 모든 공백 제거하는 방법 (2) | 2017.12.13 |
Javascript 단위 테스트(Unit Test) 환경 구축 (0) | 2017.12.04 |