Skip to content

Commit 8c1dc47

Browse files
authored
Create chapter_20.md
1 parent f733876 commit 8c1dc47

1 file changed

Lines changed: 131 additions & 0 deletions

File tree

book/공희재/chapter_20.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
# Chapter 20 - strict mode
2+
3+
## 1. strict mode란?
4+
5+
자바스크립트는 오타나 문법 지식의 미비로 인한 실수를 저지르기 쉬운 언어다. (e.g., implicit global(암묵적 전역) 등)<br/>
6+
개발자의 의도와는 다르게 오류가 발생하는 것을 막기 위해 ES5부터 **strict mode**(엄격 모드)가 추가되었다.
7+
8+
ESLint 같은 린트 도구를 사용해도 strict mode와 유사한 효과를 얻을 수 있다.<br/>
9+
더군다나 린트 도구는 static analysis(정적 분석) 기능으로 소스코드를 실행하기 전에 미리 스캔해 문법적 오류뿐만 아니라<br/>
10+
잠재적 오류까지 찾아내고 리포팅해주는 유용한 도구다.<br/>
11+
(따라서 책에서는 strict mode보다는 **ESLint 같은 린트 도구를 더 선호**한다고 밝히기는 함)
12+
13+
참고로 ES6부터 도입된 **클래스와 모듈은 기본적으로 strict mode**가 적용된다.
14+
15+
## 2. strict mode의 적용
16+
strict mode를 적용하려면 **전역의 선두**, 또는 **함수 몸체의 선두****`'use strict';`** 한 줄만 추가하면 된다.<br/>
17+
전역의 선두에 추가하면 스크립트 전체에 strict mode가 적용되고, 함수 몸체의 선두에 추가하면 해당 함수와 중첩 함수에 strict mode가 적용된다.
18+
```javascript
19+
// 전역 선두에 추가한 예제
20+
'use strict';
21+
22+
function foo() {
23+
x = 10; // ReferenceError: x is not defined
24+
}
25+
foo();
26+
```
27+
28+
```javascript
29+
// 코드의 선두에 추가하지 않으면 제대로 동작하지 않는다
30+
function foo() {
31+
x = 10; // 에러가 발생하지 않음.
32+
'use strict';
33+
}
34+
foo();
35+
```
36+
37+
## 3. 전역에 strict mode를 적용하는 것은 피하자
38+
전역에 적용한 strict mode는 아래 예제처럼 스크립트 단위로 적용된다.
39+
```html
40+
<!DOCTYPE html>
41+
<html>
42+
<body>
43+
<script>
44+
x = 1; // 에러가 발생하지 않음.
45+
console.log(x); // 1
46+
</script>
47+
<script>
48+
'use strict';
49+
y = 1; // ReferenceError: y is not defined
50+
console.log(y);
51+
</script>
52+
</body>
53+
</html>
54+
```
55+
그러나, strict mode 스크립트와 non-strict mode 스크립트를 혼용하는 것은 오류를 발생시킬 수 있다.<br/>
56+
특히 외부 서드파티 라이브러리를 사용하는 경우, 라이브러리가 non-strict mode인 경우도 있기 때문에<br/>
57+
전역에 strict mode를 적용하는 것은 어쨌든 **바람직한 행위가 아니다**.
58+
59+
## 4. 함수 단위로 strict mode를 적용하는 것도 피하자.
60+
함수 안에서 strict mode를 사용하는 것도 권장할만한 행위는 아니다.<br/>
61+
어떤 함수는 strict mode이고 어떤 함수는 non-strict mode인 것 자체가 바람직하지 않으며 모든 함수에 일일이 strict mode를 적용하는 것은 번거로운 일이다.
62+
63+
대신, strict mode는 **즉시 실행 함수로 감싼 스크립트 단위로 적용**하는 것이 바람직하다.
64+
65+
## 5. strict mode가 발생시키는 에러
66+
다음은 strict mode를 적용했을 때, 에러가 발생하는 대표적인 사례다.
67+
68+
### 5-1. 암묵적 전역
69+
애초에 var, let, const 등의 키워드로 **선언하지 않은 변수를 참조하면 `ReferenceError`를 발생**시킨다.
70+
```javascript
71+
(function () {
72+
'use strict';
73+
x = 1;
74+
console.log(x); // ReferenceError: x is not defined
75+
}());
76+
```
77+
78+
### 5-2. 변수, 함수, 매개변수의 삭제
79+
delete 연산자로 변수, 함수, 매개변수를 삭제하면 `SyntaxError`를 발생시킨다.
80+
81+
### 5-3. 매개변수 이름의 중복
82+
**중복하는 매개변수 이름을 사용하면 `SyntaxError`를 발생**시킨다.
83+
```javascript
84+
(function () {
85+
'use strict';
86+
87+
// SyntaxError: Duplicate parameter name not allowed in this context
88+
function foo(x, x) {
89+
return x + x;
90+
}
91+
console.log(foo(1, 2));
92+
}());
93+
```
94+
### 5-4. with 문의 사용
95+
with 문을 사용하면 `SyntaxError`를 발생시킨다. (사실 with 문은 애초에 사용을 지양해야 한다고 책은 언급한다.)
96+
97+
## 6. strict mode 적용에 의한 변화
98+
### 6-1. 일반 함수의 this
99+
strict mode에서 함수를 **일반 함수**로서 호출하면, **`this``undefined`가 바인딩**된다.<br/>
100+
일반 함수 내부에서는 this를 사용할 필요가 없기 때문이다. 단, 이때 에러가 발생하지는 않는다.
101+
```javascript
102+
(function () {
103+
'use strict';
104+
105+
function foo() {
106+
console.log(this); // undefined
107+
}
108+
foo();
109+
110+
function Foo() {
111+
console.log(this); // Foo
112+
}
113+
new Foo();
114+
}());
115+
```
116+
117+
### 6-2. arguments 객체
118+
strict mode에서는 매개변수에 전달된 인수를 재할당해 변경해도, **arguments 객체에 반영되지 않는다**.
119+
```javascript
120+
(function (a) {
121+
'use strict';
122+
123+
// 매개변수에 전달된 인수를 재할당해 변경해도,
124+
a = 2;
125+
126+
// 변경된 인수가 arguments 객체에 반영되지 않는다.
127+
console.log(arguments); // { 0: 1, length: 1 }
128+
}(1));
129+
```
130+
131+
끝.

0 commit comments

Comments
 (0)