ΰ­¨β”ˆβ”ˆβ”ˆ Web β”ˆβ”ˆβ”ˆΰ­§/β†˜ Javascript

[κ°œλ…] μŠ€μ½”ν”„μ™€ ν΄λ‘œμ €, this, ν˜Έμ΄μŠ€νŒ…

λΉ΅λΉ΅μƒˆ 2021. 3. 3. 14:58

 

μŠ€μ½”ν”„μ™€ ν΄λ‘œμ €

1) μŠ€μ½”ν”„ : λ³€μˆ˜μ˜ 접근성에 κ΄€ν•œ 것

- μ „μ—­ μŠ€μ½”ν”„ : 전역에 μ„ μ–Έλ˜μ–΄ μžˆμ–΄ μ–΄λŠ κ³³μ—μ„œλ“  ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλŠ” 것

- ν•¨μˆ˜ μŠ€μ½”ν”„ : ν•΄λ‹Ή μ§€μ—­μ—μ„œλ§Œ μ ‘κ·Ό κ°€λŠ₯ν•΄, 지역을 λ²—μ–΄λ‚œ κ³³μ—μ„œλŠ” μ ‘κ·Ό λΆˆκ°€

- 블둝 μŠ€μ½”ν”„ : 블둝 {}이 생성될 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ μŠ€μ½”ν”„κ°€ 생성(ES6)

2) ν΄λ‘œμ € : ν•¨μˆ˜κ°€ 또 λ‹€λ₯Έ ν•¨μˆ˜ 내뢀에 μ€‘μ²©λœ ν˜•νƒœ

 

this

1) Java

- ν˜„μž¬ 객체λ₯Ό μ°Έμ‘°

 

2) Javascript

- javascriptλŠ” ν˜„μž¬ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ°Έμ‘°, ν•˜λ‚˜μ˜ 객체

- μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ μŠ€νƒμ΄ 쑴재

  -> μŠ€νƒμ˜ 맨 μ•„λž« 뢀뢄에 λͺ¨λ“  λ™μž‘μ˜ μ‹œμž‘μ μΈ μ „μ—­ μ»¨ν…μŠ€νŠΈκ°€ μœ„μΉ˜

- μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ : λ™μž‘ 쀑인 μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œμ˜ μ†Œμœ κΆŒ

 

3) μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œ

- μ „μ—­ μ½”λ“œ : Javascript ν”„λ‘œκ·Έλž¨μ΄ μ‹œμž‘λ˜λŠ” κ³³λΆ€ν„° μˆ˜ν–‰λ˜λŠ” μ½”λ“œ, λΈŒλΌμš°μ €μ˜ 경우 window 객체가 쑴재

- Eval μ½”λ“œ : λ‚΄μž₯된 eval() ν•¨μˆ˜μ˜ 인자둜 μ „λ‹¬λ˜λŠ” λ¬Έμžμ—΄ κ°’

- ν•¨μˆ˜ μ½”λ“œ : ν•¨μˆ˜μ˜ λ³Έλ¬Έ μ½”λ“œ, ν•¨μˆ˜ λ‚΄λΆ€μ˜ λͺ¨λ“  μ½”λ“œλ₯Ό μ˜λ―Έν•˜μ§€λŠ” μ•ŠμŒ

 

4) μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ³€κ²½ν•˜λŠ” 방법

- call() : λ¦¬μŠ€νŠΈ ν˜•νƒœμ˜ 인자λ₯Ό μ „λ‹¬λ°›μŒ, 첫 번째 인자λ₯Ό ν•¨μˆ˜ μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ μ‚¬μš©

- apply() : λ°°μ—΄ ν˜•νƒœμ˜ 인자λ₯Ό μ „λ‹¬λ°›μŒ, μ²« 번째 인자λ₯Ό ν•¨μˆ˜ μ½”λ“œμ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ μ‚¬μš©

- bind() : μƒˆλ‘œμš΄ ν•¨μˆ˜μ˜ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ‘œ 전달받은 첫 번째 μΈμžμ™€ 바인딩될 μƒˆλ‘œμš΄ ν•¨μˆ˜λ₯Ό 생성, μƒˆλ‘œμš΄ ν•¨μˆ˜λŠ” μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠμŒ

 

5) μ‹€ν–‰ μ»¨ν…μŠ€νŠΈ

- μƒμ„±μž ν•¨μˆ˜ 호좜 : new User() -> ν•¨μˆ˜ λ³Έλ¬Έ λ‚΄μ˜ thisκ°€ λ‹€λ₯Έ μ„Έ κ°€μ§€ μœ ν˜•μ˜ ν•¨μˆ˜ 호좜둜 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό μ œμ™Έν•˜κ³  μƒμ„±μžλ‘œ μƒμ„±λœ 객체λ₯Ό μ°Έμ‘°

- 직접 ν•¨μˆ˜ 호좜 : ask() -> ν•¨μˆ˜ λ³Έλ¬Έ λ‚΄λΆ€μ˜ thisκ°€ λ‹€λ₯Έ μ„Έ κ°€μ§€ μœ ν˜•μ˜ ν•¨μˆ˜ 호좜둜 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό μ œμ™Έν•˜κ³  μ „μ—­ μ»¨ν…μŠ€νŠΈλ₯Ό μ°Έμ‘°

- λ©”μ†Œλ“œ 호좜 : user.speak() -> ν•¨μˆ˜ λ³Έλ¬Έ λ‚΄λΆ€μ˜ thisκ°€ λ‹€λ₯Έ μ„Έ κ°€μ§€ μœ ν˜•μ˜ ν•¨μˆ˜ 호좜둜 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό μ œμ™Έν•˜κ³  λ©”μ†Œλ“œμ— μ†ν•œ 객체 μ°Έμ‘°

- μ»¨ν…μŠ€νŠΈ λ³€κ²½ 호좜 : ask.call(this), ask.apply(this) -> ν•¨μˆ˜ λ³Έλ¬Έ λ‚΄λΆ€μ˜ thisκ°€ λ‹€λ₯Έ μ„Έ κ°€μ§€ μœ ν˜•μ˜ ν•¨μˆ˜ 호좜둜 λ§Œλ“€μ–΄μ§„ μΈμŠ€ν„΄μŠ€λ₯Ό μ œμ™Έν•˜κ³  call() λ©”μ†Œλ“œμ˜ 첫 번째 인자둜 전달받은 객체λ₯Ό μ°Έμ‘°

 

ν˜Έμ΄μŠ€νŒ…

- Javascript 인터프리터가 ν•¨μˆ˜ μ„ μ–Έκ³Ό λ³€μˆ˜ 선언을 선언듀이 속해 μžˆλŠ” μŠ€μ½”ν”„μ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” λ°©λ²•

 

ex1)

msg = 'no msg';
var msg;
console.log(msg); // no msg 좜λ ₯

function msg() {
	console.log('msg'); 
}
msg(); // Uncaught TypeError 좜λ ₯

- μœ„ 주석과 같이 좜λ ₯λ˜λŠ” 이유 -> Javascript 인터프리터가 λ‹€μŒκ³Ό 같이 μ½”λ“œλ₯Ό μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έ

// ν•¨μˆ˜ 선언을 μ΅œμƒμœ„λ‘œ μœ„μΉ˜
function msg() {
	console.log('msg'); 
}
// λ³€μˆ˜λŠ” ν•¨μˆ˜ μ•„λž˜
var msg;
msg = 'no msg';

console.log(msg); // no msg 좜λ ₯
msg(); // Uncaught TypeError: msg is not a function 좜λ ₯

var msg = function() {}와 같은 ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜ 선언이기도 ν•˜κΈ° λ•Œλ¬Έμ— μ΅œμƒμœ„λ‘œ μ΄λ™ν•˜μ§€ μ•ŠμŒ

 

ex2)

function work() {
	study();
    
    var study = function() {
   		console.log('Study at work!');
    }
    return;
    function study() {
   		console.log('Study at home!');
    }
}

study(); // Study at home! 좜λ ₯

- 인터프리터가 λ‹€μŒκ³Ό 같이 μ½”λ“œ 처리

function work() {
	function study() {
   		console.log('Study at home!');
    }
    var study;
	study();
    study = function() {
   		console.log('Study at work!');
    }
    return;
}

study(); // Study at home! 좜λ ₯

μΈν„°ν”„λ¦¬ν„°λŠ” ν•¨μˆ˜ 선언을 μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„λ‘œ μ΄λ™μ‹œν‚€κ³  λ‚˜μ„œ λ³€μˆ˜ 선언을 ν•˜μ§€λ§Œ, λŒ€μž…은 ν•˜μ§€ μ•ŠμŒ

 

=> Javascript μΈν„°ν”„λ¦¬ν„°λŠ” ν•΄λ‹Ή μŠ€μ½”ν”„μ˜ μ΅œμƒμœ„μ— ν•¨μˆ˜ 선언을 μ΄λ™μ‹œν‚€κ³ , κ·Έ λ‹€μŒ λŒ€μž… ν‘œν˜„μ‹μ΄ μ—†λŠ” λ³€μˆ˜ 선언을 μ΄λ™μ‹œν‚΄, κ·Έλž˜μ„œ return 절 이후 ν•¨μˆ˜λ₯Ό 선언해도 λ¬Έμ œκ°€ μ—†μŒ