[πŸ“– λͺ¨λ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ λ”₯λ‹€μ΄λΈŒ] 13μž₯. μŠ€μ½”ν”„

λ…Έμ˜μ™„Β·2023λ…„ 10μ›” 18일
0

JavaScript(Deep Dive)

λͺ©λ‘ 보기
8/23

μŠ€μ½”ν”„

1. μŠ€μ½”ν”„λž€?

λͺ¨λ“  μ‹λ³„μž(λ³€μˆ˜ 이름, ν•¨μˆ˜ 이름, 클래슀 이름 λ“±)λŠ” μžμ‹ μ΄ μ„ μ–Έλœ μœ„μΉ˜μ— μ˜ν•΄ λ‹€λ₯Έ μ½”λ“œκ°€ μ‹λ³„μž μžμ‹ μ„ μ°Έμ‘°ν•  수 μžˆλŠ” 유효 λ²”μœ„κ°€ κ²°μ •λœλ‹€. 이λ₯Ό μŠ€μ½”ν”„λΌ ν•œλ‹€. 즉, μŠ€μ½”ν”„λŠ” μ‹λ³„μžκ°€ μœ νš¨ν•œ λ²”μœ„λ₯Ό λ§ν•œλ‹€.

μŠ€μ½”ν”„(유효 λ²”μœ„)λ₯Ό 톡해 μ‹λ³„μžμΈ λ³€μˆ˜ μ΄λ¦„μ˜ μΆ©λŒμ„ λ°©μ§€ν•˜μ—¬ 같은 μ΄λ¦„μ˜ λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  수 있게 ν•œλ‹€. μŠ€μ½”ν”„ λ‚΄μ—μ„œ μ‹λ³„μžλŠ” μœ μΌν•΄μ•Ό ν•˜μ§€λ§Œ λ‹€λ₯Έ μŠ€μ½”ν”„μ—λŠ” 같은 μ΄λ¦„μ˜ μ‹λ³„μžλ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

var x = 'global';

function foo() {
	var x = 'local';
	console.log(x); // local
}

foo()

console.log(x); // global
// varλŠ” ν•¨μˆ˜ μŠ€μ½”ν”„λ₯Ό κ°–λŠ”λ‹€.

μ½”λ“œμ˜ λ°”κΉ₯ μ˜μ—­κ³Ό foo ν•¨μˆ˜ 내뢀에 같은 이름을 κ°–λŠ” x λ³€μˆ˜λ₯Ό μ„ μ–Έν–ˆκ³  두 개의 λ³€μˆ˜ μ€‘μ—μ„œ μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지λ₯Ό κ²°μ • 이λ₯Ό μ‹λ³„μž 결정이라 ν•˜λ©° μžλ°”μŠ€ν¬λ¦½νŠΈμ—”μ§„μ€ μŠ€μ½”ν”„λ₯Ό 톡해 μ–΄λ–€ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•΄μ•Ό ν•  것인지 κ²°μ •ν•œλ‹€. λ”°λΌμ„œ μŠ€μ½”ν”„λž€ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진이 μ‹λ³„μžλ₯Ό 검색할 λŒ€ μ‚¬μš©ν•˜λŠ” κ·œμΉ™μ΄λΌκ³ λ„ ν•  수 μžˆλ‹€.

πŸ’‘ var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•œ λ³€μˆ˜μ˜ 쀑볡 μ„ μ–Έ

  • var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언이 ν—ˆμš©λœλ‹€. μ΄λŠ” μ˜λ„μΉ˜ μ•Šκ²Œ λ³€μˆ˜κ°’μ΄ μž¬ν• λ‹Ήλ˜μ–΄ λ³€κ²½λ˜λŠ” λΆ€μž‘μš©μ„ λ°œμƒμ‹œν‚¨λ‹€.
  • letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” κ°€νŠΌ μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
function foo() {
	var x = 1;
	// var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•œλ‹€.
	// μ•„λž˜ λ³€μˆ˜ 선언문은 μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진에 μ˜ν•΄ var ν‚€μ›Œλ“œκ°€ μ—†λŠ” κ²ƒμ²˜λŸΌ λ™μž‘ν•œλ‹€.
	var x= 2;
	console.log(x); //2
}
foo()

function bar() {
	let x = 1;
	// letμ΄λ‚˜ const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 같은 μŠ€μ½”ν”„ λ‚΄μ—μ„œ 쀑볡 선언을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
	let x = 2; // SyntaxError 이미 쑴재
}
bar();

2. μŠ€μ½”ν”„μ˜ μ’…λ₯˜

  • μ½”λ“œλŠ” μ „μ—­κ³Ό μ§€μ—­μœΌλ‘œ ꡬ뢄할 수 μžˆλ‹€.
ꡬ뢄섀λͺ…μŠ€μ½”ν”„λ³€μˆ˜
μ „μ—­μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ •κ²¨ μŠ€μ½”ν”„μ „μ—­ λ³€μˆ˜
μ§€μ—­ν•¨μˆ˜ λͺΈμ²΄ 내뢀지역 μŠ€μ½”ν”„μ§€μ—­ λ³€μˆ˜

λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλ˜ μœ„μΉ˜(μ „μ—­ λ˜λŠ” 지역)에 μ˜ν•΄ μžμ‹ μ΄ μœ νš¨ν•œ λ²”μœ„μΈ μŠ€μ½”ν”„κ°€ κ²°μ •λœλ‹€. 즉, μ „μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°–λŠ” μ „μ—­ λ³€μˆ˜μ΄κ³ , μ§€μ—­μ—μ„œ μ„ μ–Έλœ λ³€μˆ˜λŠ” 지역 μŠ€μ½”ν”„λ₯Ό κ°–λŠ” 지역 λ³€μˆ˜λ‹€.

2-1. μ „μ—­κ³Ό μ „μ—­μŠ€μ½”ν”„

μ „μ—­μ΄λž€ μ½”λ“œμ˜ κ°€μž₯ λ°”κΉ₯ μ˜μ—­μ„ λ§ν•˜κ³  전역은 μ „μ—­ μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€. λ˜ν•œ 전역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ©΄ μ „μ—­ μŠ€μ½”ν”„λ₯Ό κ°–λŠ” μ „μ—­ λ³€μˆ˜κ°€ λœλ‹€. μ „μ—­ λ³€μˆ˜λŠ” μ–΄λ””μ„œλ“ μ§€ μ°Έμ‘° κ°€λŠ₯

2-2. 지역과 μ§€μ—­μŠ€μ½”ν”„

지역 μ΄λž€ ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€λ₯Ό λ§ν•œλ‹€. 지역은 지역 μŠ€μ½”ν”„λ₯Ό λ§Œλ“ λ‹€. 지역에 λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ μ§€μ—­μŠ€μ½”ν”„λ₯Ό κ°–λŠ” 지역 λ³€μˆ˜κ°€ λœλ‹€. 지역 λ³€μˆ˜λŠ” μžμ‹ μ΄ μ„ μ–Έλœ 지역과 ν•˜μœ„ 지역(쀑첩 ν•¨μˆ˜)μ—μ„œλ§Œ μ°Έμ‘°ν•  수 μžˆλ‹€. λ‹€μ‹œ 말해, 지역 λ³€μˆ˜λŠ” μžμ‹ μ˜ 지역 μŠ€μ½”ν”„μ™€ ν•˜μœ„ 지역 μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•˜λ‹€.

3. μŠ€μ½”ν”„ 체인

μŠ€μ½”ν”„κ°€ κ³„μΈ΅μ μœΌλ‘œ μ—°κ²°λœ 것을 μŠ€μ½”ν”„ 체인이라 ν•œλ‹€.

ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ ν•¨μˆ˜κ°€ μ •μ˜λœ 것을 ν•¨μˆ˜μ˜ μ€‘μ²©μ΄λΌν•˜κ³  ν•¨μˆ˜ λͺΈμ²΄ λ‚΄λΆ€μ—μ„œ μ •μ˜ν•œ ν•¨μˆ˜λ₯Ό 쀑첩 ν•¨μˆ˜ 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜λ₯Ό μ™ΈλΆ€ ν•¨μˆ˜λΌκ³  ν•œλ‹€.

ν•¨μˆ˜λŠ” 쀑첩될 수 μžˆμœΌλ―€λ‘œ ν•¨μˆ˜μ˜ 지역 μŠ€μ½”ν”„λ„ 쀑첩될 수 μžˆλ‹€ μ΄λŠ” μŠ€μ½”ν”„κ°€ ν•¨μˆ˜μ˜ 쀑첩에 μ˜ν•΄ 계측적 ꡬ쑰λ₯Ό κ°–λŠ”λ‹€. λ‹€μ‹œ 말해, 쀑첩 ν•¨μˆ˜μ˜ μ§€μ—­μŠ€μ½”ν”„λŠ” 쀑첩 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•˜λŠ” μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 μŠ€μ½”ν”„μ™€ 계측적 ꡬ쑰λ₯Ό κ°–λŠ”λ‹€. μ΄λ•Œ μ™ΈλΆ€ ν•¨μˆ˜μ˜ 지역 μŠ€μ½”ν”„λ₯Ό μƒμœ„ μŠ€μ½”ν”„λΌκ³  ν•œλ‹€.

λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•  λ•Œ μžλ°”μŠ€ν¬λ¦½νŠΈ 엔진은 μŠ€μ½”ν”„ 체인을 톡해 λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜λŠ” μ½”λ“œμ˜ μŠ€μ½”ν”„μ—μ„œ μ‹œμž‘ν•˜μ—¬ μƒμœ„ μŠ€μ½”ν”„ λ°©ν–₯으둜 μ΄λ™ν•˜λ©° μ„ μ–Έλœ λ³€μˆ˜λ₯Ό κ²€μƒ‰ν•œλ‹€.

μ΄λŠ” μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λŠ” ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ 자유둭게 μ°Έμ‘°ν•  수 μžˆμ§€λ§Œ ν•˜μœ„ μŠ€μ½”ν”„μ—μ„œ μœ νš¨ν•œ λ³€μˆ˜λ₯Ό μƒμœ„ μŠ€μ½”ν”„μ—μ„œ μ°Έμ‘°ν•  수 μ—†λ‹€.

4. ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

μ½”λ“œ 블둝이 μ•„λ‹Œ ν•¨μˆ˜μ— μ˜ν•΄μ„œλ§Œ 지역 μŠ€μ½”ν”„κ°€ μƒμ„±λœλ‹€λŠ” 것을 의미.

var ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ λ³€μˆ˜λŠ” μ˜€λ‘œμ§€ ν•¨μˆ˜μ˜ μ½”λ“œ 블둝(ν•¨μˆ˜ λͺΈμ²΄)λ§Œμ„ 지역 μŠ€μ½”ν”„λ‘œ 인정 μ΄λŸ¬ν•œ νŠΉμ„±μ„ ν•¨μˆ˜ 레벨 μŠ€μ½”ν”„

5. λ ‰μ‹œμ»¬ μŠ€μ½”ν”„

var x = 1;

function foo() {
	var x = 10;
	bar();
}

function bar() {
	console.log(x);
}

foo(); // 1
bar(); // 1

μœ„ 예제의 μ‹€ν–‰ κ²°κ³ΌλŠ” bar ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„κ°€ 무엇인지에 따라 κ²°μ •

βœ”οΈ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„ κ²°μ •

μ΄λŸ¬ν•œ 방식을 동적 μŠ€μ½”ν”„λΌ ν•œλ‹€. ν•¨μˆ˜κ°€ ν˜ΈμΆœλ˜λŠ” μ‹œμ μ— λ™μ μœΌλ‘œ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. 동적 μŠ€μ½”ν”„μ— λ°©μ‹μœΌλ‘œ bar ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” foo ν•¨μˆ˜μ˜ μ§€μ—­μŠ€μ½”ν”„μ™€ μ „μ—­μŠ€μ½”ν”„ 일 것이닀.

βœ”οΈ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„ κ²°μ •

μ΄λŸ¬ν•œ 방식을 λ ‰μ‹œμ»¬ μŠ€μ½”ν”„ λ˜λŠ” 정적 μŠ€μ½”ν”„λΌ ν•œλ‹€. ν•¨μˆ˜ μ •μ˜κ°€ ν‰κ°€λ˜λŠ” μ‹œμ μ— μƒμœ„ μŠ€μ½”ν”„κ°€ μ •μ μœΌλ‘œ κ²°μ •λ˜κΈ° λ•Œλ¬Έμ— 정적 μŠ€μ½”ν”„λΌκ³  λΆ€λ₯Έλ‹€.

πŸ’‘ μžλ°”μŠ€ν¬λ¦½νŠΈλŠ” λ ‰μ‹œμ»¬ μŠ€μ½”ν”„λ₯Ό λ”°λ₯΄λ―€λ‘œ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ ν˜ΈμΆœν–ˆλŠ”μ§€κ°€ μ•„λ‹ˆλΌ ν•¨μˆ˜λ₯Ό μ–΄λ””μ„œ μ •μ˜ν–ˆλŠ”μ§€μ— 따라 μƒμœ„ μŠ€μ½”ν”„λ₯Ό κ²°μ •ν•œλ‹€. ν•¨μˆ˜κ°€ 호좜된 μœ„μΉ˜λŠ” μƒμœ„ μŠ€μ½”ν”„ 결정에 μ–΄λ– ν•œ 영ν–₯도 주지 μ•ŠλŠ”λ‹€. 즉, ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” μ–Έμ œλ‚˜ μžμ‹ μ΄ μ •μ˜λœ μŠ€μ½”ν”„λ‹€.

πŸ’‘ 이처럼 ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λŠ” ν•¨μˆ˜ μ •μ˜κ°€ 싀행될 λ•Œ μ •μ μœΌλ‘œ κ²°μ •λœλ‹€. ν•¨μˆ˜ μ •μ˜(ν•¨μˆ˜ μ„ μ–Έλ¬Έ λ˜λŠ” ν•¨μˆ˜ ν‘œν˜„μ‹)κ°€ μ‹€ν–‰λ˜μ–΄ μƒμ„±λœ ν•¨μˆ˜ κ°μ²΄λŠ” μ΄λ ‡κ²Œ κ²°μ •λœ μƒμœ„ μŠ€μ½”ν”„λ₯Ό κΈ°μ–΅ν•œλ‹€. ν•¨μˆ˜κ°€ 호좜될 λ•Œλ§ˆλ‹€ ν•¨μˆ˜μ˜ μƒμœ„ μŠ€μ½”ν”„λ₯Ό μ°Έμ‘°ν•  ν•„μš”κ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

0개의 λŒ“κΈ€