strict 모드 (엄격 모드) JAVASCRIPT

es는 기본적으로 문법적인 자유도(?)가 높은 편이다. 원래는 에러여야 할걸 엔진이 처리했으니 개인적으로 개발할때는 편하지만, 여럿이서 대규모로 개발할 경우에는 같은 코딩 규칙을 지켜야 할 때가 있는데 이 때 자유도를 제한하도록 할 수 있는게 strict 모드라 할 수 있겠다.

1. 선언 방법
함수의 시작 혹은 문서의 시작에 'use strict'을 달아두면 된다.


1
2
"use strict";
var sayHello = "안뇽?";

1
2
3
4
5
function stricting(){
'use strict';
return "아이유는 너무 예뻐";
}
stricting();


2. 실수 방지
기존에 에러를 무시하던 것을 에러로 안내해 준다.

1
2
3
'use strict';
hello = "안녕?";
// 선언이 안된 undefind에다가 값 할당 안된다는 에러

 1
2
3
4
5
6
7
8
9
10
11
12
"use strict";
var myObj = Object.defineProperties({}, {
cannot: {
value: 'a',
writable: false // 못쓰게하는것 immutable
},
can: {
value: 'b'
}
});
nyObj.cannot = 20;
// immutable 프로퍼티에 쓸수 없다고 에러

1
2
3
4
"use strict";
var testObj = { get cannot() { return 0; } };
testObj.cannot = 'abc';
// getter는 수정 불가능한 값. 애초에 저렇게 호출할 수도 없음.

1
2
3
4
5
6
7
8
9
var nonExtensible = { removable: true };
Object.preventExtensions(nonExtensible);

// 엄격 모드에서, 확장 불가 객체에 새 속성을 추가하려는 시도는 TypeError가 발생합니다.
function fail() {
'use strict';
nonExtensible.newProperty = 'Umm';
}
fail();

1
2
3
4
5
6
7
8
'use strict'
var o = {}; // 새로운 객체 생성
Object.defineProperty(o, 'a', {
value: 37,
configurable: false
});
delete o.a // 삭제 불가능한 객체 에러
this.o // window 객체를 this로 접근 불가

1
2
3
4
5
6
7
function(){
'use strict';
var test = function(p1,p1){
}
test();
}
// 예외발생 중복 매개변수명 불가

1
2
"use strict";
var a = 0o10; // ES6: 8진수 - ES5: 불가 (각 브라우저별 자체 지원했으나 엄격모드에서는 안됨)

1
2
3
4
"use strict";
(372).hello = "^^";
"StringTest".hello = "^^";
// 원시 값(primitive values)의 재할당이 안됨

1
2
3
4
5
6
"use strict";
var a = {}
with (a){
x = 10;
}
// es3이후서부턴 안쓰는게 중론이었던거라 그냥 상식으로 알고있자 mdn도 설명 생략할 정도다 ㅋ.

1
2
3
4
"use strict";
var eval = 19;
var arguments = 20;
// eval, arguments를 식별자로써 쓸 수 없다.

1
2
3
4
5
6
function testing(param){
"use strict";
param = "안녕";
return [param, arguments[0]]; // "hello" - arguments는 처음 할당된 값만 사용한다.
}
testing("hello")

1
2
3
4
5
6
7
8
"use strict";
function f() {
return "여기여야되지롱";
// 호이스팅이 되지 않는다. (함수선언은 무조건 동적 스코프의 최상단에서 해야한다)
}
if (true){
f();
}

많은 예시를 들었는데 이 중에서 머릿속에 외워둬야 할 만한 것만 몇 개 추리자면 다음과 같다.

1. 호이스팅이 되지 않는다.
2. defineProperties 의 설정을 반드시 지켜야 한다. (writable, configurable)
3. preventExtensions 로 가둬놓은걸 지켜야 한다.
4. arguments, eval의 활용성이 대폭 줄었다.
5. 변수는 반드시 선언 후 사용해야 한다.
6. getter, setter 는 사용법을 지켜야 한다.

이정도만 외워도 나머지는 거의 사용하지 않는 경우이므로 무방할 듯 하다.

덧글

댓글 입력 영역