-
Notifications
You must be signed in to change notification settings - Fork 0
javascript_in_depth_1
์ค์ฝํ(scope)๋ ํ์ฌ ์์น์์ ๋ณผ ์ ์๋ ๋ณ์๋ค์ ๋ฒ์๋ฅผ ๋ปํ๋ค.
์ด๋ ํ ๋ณ์๊ฐ ์ค์ฝํ์์ ์ ์ธ๋์ด ์์ผ๋ฉด ํด๋น ์ค์ฝํ ์์์๋ ๋ณ์์ ์ ๊ทผํด์ ์ฝ๊ฑฐ๋ ์ธ์ ์๊ณ ,
์ค์ฝํ ๋ฐ์์๋ ํด๋น ๋ณ์์ ์ ๊ทผํ ์ ์๋ค.

์ค์ฝํ ์์ฑ์ ๋ฐ์ํ๋ ๋ฌธ์ ์์
์์ ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ ์ค์ฝํ๊ฐ ์์ฑ๋๊ณ ์ ์ง๋๋ ๋ฐฉ๋ฒ ๋๋ฌธ์ ์๊ธฐ๋ ๊ฒ์ด๋ค.
์ด ๋ฌธ์ ๋ ๋ค๋ฅธ ์ธ์ด์๋ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ง ๋๋ฌธ์ ๋ฐ์ํ๋ ๊ฒ์ผ๋ก, ์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ์ ํด๋ก์ ์ ๋ํด์ ์ ์์์ผ ํ๋ ์ด์ ๊ฐ ์ฌ๊ธฐ์ ์๋ค.

foo-loop๋ฅผ ๋๋ฉด์ addEventListener()๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ์ค์ ํ ๋ ์ต๋ช
ํจ์๊ฐ ์ ์ธ๋๋ฉด์ ์ด๋๋ถํฐ ์ค์ฝํ๊ฐ ์์ฑ๋์ด
์ค์ฝํ ์ฒด์ธ(scope-chain)์ ๋ง๋ค๊ฒ ๋๋ค. ๊ฐ <div>์ ํด๋ฆญ ์ด๋ฒคํธ์ ์ค์ ๋์๋ ์ฝ๋ฐฑ ํจ์๋ค์ ๋ชจ๋ ๊ฐ์ ์ค์ฝํ์ ๋ณ์์ธ i๋ฅผ ์ฐธ์กฐํ๋ค. 3๋ฒ์งธ ๋ฃจํ๋ฅผ ๋๊ณ ๋์ ๋ง์ง๋ง์ i++๊ฐ ๋๊ณ ๋๋ฉด ๋ณ์ i์ ๊ฐ์ด 3์ด ๋๋ฉด์ ์ต์ข
์ ์ผ๋ก ๋ชจ๋ ์ฝ๋ฐฑ ํจ์๋ค์ ๊ฐ์ด 3์ธ i๋ฅผ ์ฐธ์กฐํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ค์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์ผ์ด๋๋ฉด alert() ํจ์๋ ๊ฐ์ด 3์ธ i๋ฅผ ์ฐธ์กฐํ๊ฒ ๋์ด ๋ชจ๋ ๋๊ฐ์ด "You clicked div #3"์ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
for-loop ๋ธ๋ก ์ค์ฝํ ์ํ ์์
์์ ์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ๊ฐ์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. ์ด์ฒ๋ผ ์๋ฐ์คํฌ๋ฆฝํธ๋ ๋ค๋ฅธ ์ธ์ด์ ๋ฌ๋ฆฌ ์ผ๋ฐ์ ์ธ ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฐ๋ฅด์ง ์๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ ํน์ ๊ตฌ๋ฌธ์ด ์คํ๋ ๋ ์ค์ฝํ๋ฅผ ์๋ก ๋ง๋ค์ด์ ์ค์ฝํ ์ฒด์ธ์ ์์ฑํ๊ฒ ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์์ ์ค์ฝํ๋ฅผ ์์ฑํ๋ ๊ตฌ๋ฌธ
- function
- with
- catch
1) function
function ๋ธ๋ก ์ค์ฝํ ์ํ ์์
2) catch
catch๋ ๋ด๋ถ๋ก ์ ๋ฌ๋๋ ํ๋ผ๋ฏธํฐ๋ ๋ธ๋ก ๋ด๋ถ์์๋ง ์ ๊ทผ๊ฐ๋ฅํ๊ณ , ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ค.
๋ด๋ถ์์ ์ ์ธ๋ ๋ณ์๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ค.
3) with
with ๊ตฌ๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ๊ฐ์ฒด๋ฅผ ์ค์ฝํ์ฒด์ธ์ ์ถ๊ฐํ์ฌ ๋์ํ๋ค.
with (object) {
statement;
}์ธ์๋ก ๋ฐ์ object๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ณ์๋ค์ ์ค์ฝํ ์ฒด์ธ์ ์ถ๊ฐํ์ฌ ํด๋น ๋ณ์๋ค์ ๋ก์ปฌ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค.
with๋ฅผ ์ด์ฉํ ๋ฌธ์ ํด๊ฒฐ ์์

with๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ฉด ์๋๋ ์ด์
- with ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์์ค์ ๋ชจํธ์ฑ
function doSomething(value, obj) {
with (obj) {
console.log(value);
value = "which scope is this?";
}
}value๊ฐ ์ด๋ค value๋ฅผ ๋งํ๋์ง ์๊ธฐ๊ฐ ์ด๋ ต๋ค. doSomething์์ ์ฌ์ฉํ๋ value์ด๊ฑฐ๋, obj ๋ด๋ถ์ value์ด๊ฑฐ๋ ๋์ค ํ๋์ธ๋ฐ, ์ด ๋ถ๋ถ์ ํ์ธํ๊ธฐ ์ํด obj์ ๊ตฌ์กฐ๋ถํฐ ํ์ ํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ด ์๊ธด๋ค.
- ECMAScript 6 ํ์ค์์ with ๊ตฌ๋ฌธ ์ ์ธ
- with ๊ตฌ๋ฌธ์ผ๋ก DOM ์คํ์ผ ์ค์ ๋ฌธ์ ์ ๋์
var s = document.getElementById("myDiv").style;
s.background = "yellow";
s.color = "red";
s.border = "1px solide black";DOM์ ํ์ ์์ฑ์๋ ์์ฒด์ ์ผ๋ก ๋ณ์๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ ์์ฑ์ ์ค์ ํ ์ ์๋ค.
์ค์ฝํ๊ฐ ์์ฑ๋๋ ๋ฐฉ์์ ๊ธฐ์กด ์ธ์ด์ ๋ค๋ฅด์ง ์์ง๋ง, ์ค์ฝํ๊ฐ ์ง์๋๋๊ฒ์ ๋ค๋ฅธ ์ธ์ด์๋ ๋ค๋ฅธ ์๋ฐ์คํฌ๋ฆฝํธ๋ง์ ๊ฐ์ ์ด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ด๋ฌํ ์ค์ฝํ์ ์ง์์ฑ์ด ํ์ํ ์ด์ ๋ ์๋ก์ด ์ค์ฝํ๊ฐ ์์ฑ๋๊ณ ์ค์ฝํ ์ฒด์ธ์ ์ฐธ์กฐํ๋ ํจ์๋ฅผ ๋ณ์์๋ ๋ฃ์ ์ ์๊ณ , ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ๋๊ฒจ์ค ์๋ ์์ผ๋ฉฐ, ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ํ์ฉํ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ์ง๊ธ ํจ์๊ฐ ์ ์ธ๋ ๊ณณ์ด ์๋ ์ ํ ๋ค๋ฅธ๊ณณ์์ ํจ์๊ฐ ํธ์ถ๋ ์ ์์ด์, ํด๋น ํจ์๊ฐ ํ์ฌ ์ฐธ์กฐํ๋ ์ค์ฝํ๋ฅผ ์ง์ํ ํ์๊ฐ ์๋ ๊ฒ์ด๋ค.
1) ํจ์๋ฅผ ์ด์ฉํ ๋ฌธ์ ํด๊ฒฐ
ํจ์๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฌธ์ ํด๊ฒฐ

with ๊ตฌ๋ฌธ์ ๋น์ทํ ์ค์ฝํ์ฒด์ธ์ ์์ฑํ๋ค. ํ์ง๋ง with๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ชจํธ์ฑ์ ๋ฐฐ์ ํ๊ณ , ์๋ฒฝํ๊ฒ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ณ๋์ ์ค์ฝํ๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๊ฒ ๋๋ค. ์ด๋ ๊ฒ ํ์ํ ๋ ํจ์๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ง์ด ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์์๋ ์ค์ํ๊ฒ ์๊ฐํด์ผ ํ๋ ๊ฐ๋ฐ ๋ฐฉ์์ด๋ค.
2) ํด๋ก์ ๋ฅผ ์ด์ฉํ ๋ฌธ์ ํด๊ฒฐ
ํด๋ก์ ๋ฅผ ์ด์ฉํ ์ด๋ฒคํธ ํธ๋ค๋ฌ ๋ฌธ์ ํด๊ฒฐ
IIFE๋ฅผ ์ฌ์ฉํด์ ํจ์(function)์ ๋ง๋ค์ด์ ๋ฐํํ๋ ํํ๋ก ๊ตฌํ๋์ด ์๋ค.
๋ฐํ๋ ํจ์๋ index ๋ณ์๋ฅผ ์์ ์ค์ฝํ ์ฒด์ธ์ ์ถ๊ฐํ ๋ค addEventListener() ํจ์์ 2๋ฒ์งธ ์ธ์๋ก ๋ค์ด๊ฐ๋ค.

ํน์ ํจ์๊ฐ ์ฐธ์กฐํ๋ ๋ณ์๋ค์ด ์ ์ธ๋ ๋ ์์ปฌ ์ค์ฝํ(lexical scope)๋ ๊ณ์ ์ ์ง๋๋๋ฐ, ๊ทธ ํจ์์ ์ค์ฝํ๋ฅผ ๋ฌถ์ด์ ํด๋ก์ ๋ผ๊ณ ํ๋ค.
count ๋ณ์๋ outer() ํจ์์ ๋ก์ปฌ ๋ณ์์ด๋ฏ๋ก ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์๋ค. ๋ง์น ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ํํ ๋งํ๋ 'private ๋ณ์'์ ๋น์ทํ๋ค. ๊ทธ๋ฐ๋ฐ count ๋ณ์์ ์ ๊ทผํ๋ ๋ ๋ค๋ฅธ ํจ์ inner๋ฅผ outer() ํจ์์ ๋ฐํ๊ฐ์ผ๋ก ์ง์ ํ๊ณ , ์ด๋ฅผ ๊ธ๋ก๋ฒ ์์ญ์ ์๋ increas ๋ณ์์ ํ ๋นํจ์ผ๋ก์จ, outer() ํจ์ ์ธ๋ถ์์๋ increase ๋ณ์๋ฅผ ํตํด count ๋ณ์์ ์ ๊ทผํ ์ ์๊ฒ ๋์๋ค.
ํด๋ก์ ๋ฅผ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ๊ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ชจ๋์์ private์ผ๋ก ๋์ ๋ณ์๋ฅผ ๋ณดํธํ๊ณ ์ถ์ ๋๋ static ๋ณ์๋ฅผ ์ด์ฉํ๊ณ ์ถ์ ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ์์ ์ผ๋ก ์ฝ๋ฐฑ ํจ์์ ์ถ๊ฐ์ ์ธ ๊ฐ๋ค์ ๋๊ฒจ์ค์ ํ์ฉํ๊ฑฐ๋ ์ฒ์์ ์ด๊ธฐํํ๋ ๊ฐ์ ๊ณ์ ์ ์งํ๊ณ ์ถ์ ๋๋ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
ํด๋ก์ ์ ์ค์ ํ์ฉ ์์
- ํด๋ก์ ๋ก ํ๋ฒ๋ง DOM ํ์ํ๊ณ appendDiv๋ฅผ ๊ณ์ ๋ณด๊ดํ์ฌ ํ์ฉ
-
<div>,<img>๋ฑ ๋ ธ๋/ํ ํ๋ฆฟ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ๋ง๋ค์ด๋๊ณ ํ์์์ ๋ณต์ ์์ฑํ์ฌ ํ์ฉ - ํ๋์
<div>์๋ง ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ค์ ํ์ฌ ๊ด๋ฆฌํ ์ ์๋ ์ด๋ฒคํธ ๋ธ๋ฆฌ๊ฒ์ด์ ํจํด - ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋์ ์๋ฆฌ๋จผํธ๋ฅผ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ ธ์ค๊ธฐ
- callback ๋ณ์๋ฅผ ํ์ํ์ฌ ๋์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ฝ๋ฐฑํจ์ ํธ์ถํ๊ธฐ
- HTML5 ์คํ์ ๋ง๋ ์ฌ์ฉ์ ์ ์ 'data-์์ฑ' ์ฌ์ฉํ๊ธฐ ์ปค์คํ ๋ฐ์ดํฐ ์ฌ์ฉํ๊ธฐ
- ๋ฐ๋ณต์ ์ผ๋ก ๊ฐ์ ์์ ์ ํ ๋
- ๊ฐ์ ์ด๊ธฐํ ์์ ์ด ์ง์์ ์ผ๋ก ํ์ํ ๋
- ์ฝ๋ฐฑํจ์์ ๋์ ์ธ ๋ฐ์ดํฐ๋ฅผ ๋๊ฒจ์ฃผ๊ณ ์ถ์ ๋
1) ํด๋ก์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๋ค. setTimeout()์ด๋ ์ด๋ฒคํธ์ ๋ํ ์ฝ๋ฐฑ ํจ์๋ฑ์ผ๋ก ๋ฑ๋กํ๋ ํจ์๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ๋จ์์๊ฒ ๋๋ฉด, ํด๋นํ๋ ํด๋ก์ ๋ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ๊ณ์ ๋จ์์๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๋ฃจํ๋ฅผ ๋๋ฉด์ ํด๋ก์ ๋ฅผ ๊ณ์ ์์ฑํ๋ ์ค๊ณ๋ ์ง์ํด์ผ ํ๋ค. ํด๋ก์ ๋ฅผ ์์ฑํ ๋๋ ํ๋์ ์ปค๋ค๋ ํด๋ก์ ๋ฅผ ์์ฑํ๊ธฐ๋ณด๋ค๋ ๊ฐ ๋ณ์๋ ํจ์๋ค์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ๋ถ์ํ ๋ค์ ํจ์จ์ ์ผ๋ก ๋๋๋ฉด ์ข๋ค.
2) ์ค์ฝํ ์์ฑ๊ณผ ์ดํ ๋ณ์ ์กฐํ์ ๋ฐ๋ฅธ ํผํฌ๋จผ์ค ์ํด๊ฐ ์๋ค. ํด๋ก์ ํ์์ ์๋ ํจ์์์ ์์์ ์๋ ๋ณ์์ ์ ๊ทผํ๊ณ ์ ํ ๋ ํด๋ก์ ๋ก ์์ฑํ ์ค์ฝํ๋ฅผ ํ์ํด์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค. ์ต๊ทผ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง๋ค์ด ์ด๋ฌํ ์ค์ฝํ์ฒด์ธ ๋ด์ ๋ณ์ ํ์์ ๋ํ ์ต์ ํ๋ฅผ ํ๊ณ ์์ด์ ์ค์ฝํ ์ฒด์ธ์ด ํ๋๋ ๋ ๊ฐ์ด๋ฉด ํฐ ์ฐจ์ด๋ ์๋ค. ํ์ง๋ง ๊ณผํ๊ฒ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์ํฉ์ด ์์ฌ์ ํผํฌ๋จผ์ค์ ์ํฅ์ ๋ฏธ์น๋ค.
