ํด๋น ์ฌ์ดํธ์ ์ธํฐ๋ทฐ ๋ฌธ์ ๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ฒ์ญํ์์ต๋๋ค.
https://dev.to/macmacky/70-javascript-interview-questions-5gfi
ํด๋น ์ฌ์ดํธ์ ๋์์ธ ๋ฐ ๋ ์ด์์์ ์ฐธ๊ณ ํ์์ต๋๋ค.
https://github.com/sudheerj/reactjs-interview-questions
-
undefined์ null์ JavaScript์ 7๊ฐ์ ๊ธฐ๋ณธ์ ์ธ ํ์ ์ด๋ค.
undefined์ null์ ๊ฐ์ false๋ฅผ ๊ฐ์ง๋ค. ์ด๋ ( !!value ) ๋ฑ์ ํตํด ํ์ธํ ์ ์๋ค.
console.log(!!null); //logs false console.log(!!undefined); //logs false
undefined๋ ํน์ ๊ฐ์ด ํ ๋น๋์ง ์์ ๋ณ์์ ๊ธฐ๋ณธ๊ฐ์ด๋ค. ๋ณดํต ์ ์ธ๋ง ํ๊ณ ์ด๊ธฐํ๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ์ undefined ๊ฐ์ ๊ฐ์ง๊ฒ๋๋ค.
let test; const doNothing = () => {}; console.log(test); //logs undefined console.log(doNothing()); //logs undefined
null์ ์ผ์ข ์ '๊ฐ์ด ์๋ ๊ฐ'์ด๋ค. ๋ช ์์ ์ผ๋ก ์ ์๋ ํ์ ์ค ํ๋์ด๋ค. ์ฌ๊ธฐ์ fs.readFile ๋ฉ์๋๊ฐ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์์ผ๋ฉด null ๊ฐ์ ์ป๋๋ค.
var test = null; console.log(test); fs.readFile('path/to/file', (e,data) => { console.log(e); //it logs null when no error occurred console.log(data); });
-
๋ ผ๋ฆฌ ์ฐ์ฐ์์ AND ๋ผ๊ณ ํ๋ฉฐ, ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ณดํต Boolean(๋ ผ๋ฆฌ์ ) ๊ฐ๊ณผ ํจ๊ป ์ฐ์ด๋ฉฐ, ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค. ์ฒซ๋ฒ์งธ ํํ์์ด ๊ฑฐ์ง์ด๋ฉด ์ฒซ๋ฒ์งธ ํํ์์ ๋ฐํํ๋ฉฐ, ์ฐธ์ด๋ฉด ๋๋ฒ์งธ ํํ์์ ๋ฐํํ๋ค.
conMobile์ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด true๋ฅผ ๋ฐํํ๋ค. ๋๋ฌธ์ release()ํจ์๋ฅผ ์ํํ ์ ์๋ค. if ๋์ && ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด์ ์งํํ ์ ์๋ค.
// if๋ฌธ ์ฌ์ฉ if (conMobile) { conMobile.release(); } // && ์ฐ์ฐ์ ์ฌ์ฉ conMobile && conMobile.release();
-
๋ ผ๋ฆฌ ์ฐ์ฐ์์ OR ๋ผ๊ณ ํ๋ฉฐ, ๋ ผ๋ฆฌ ์ฐ์ฐ์๋ ๋ณดํต Boolean(๋ ผ๋ฆฌ์ ) ๊ฐ๊ณผ ํจ๊ป ์ฐ์ด๋ฉฐ, ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค. ์ฒซ๋ฒ์งธ ํํ์์ด ๊ฑฐ์ง์ด๋ฉด ๋๋ฒ์งธ ํํ์์ ๋ฐํํ๋ฉฐ, ์ฐธ์ด๋ฉด ์ฒซ๋ฒ์งธ ํํ์์ ๋ฐํํ๋ค.
null์ false๊ฐ์ ๊ฐ์ง๊ณ 1์ true๊ฐ์ ๊ฐ์ง๋ค. ๋๋ฌธ์ 1์ด ๋จผ์ ๋ฐํ๋๊ณ , undefined์ ๋ค์ || ์ฐ์ฐ์ ์ํํ๋ค. undefined๋ false๊ฐ์ ๊ฐ์ง๊ธฐ์ true๊ฐ์ธ 1์ด ๋ฆฌํด๋๋ค.
console.log(null || 1 || undefined); //logs 1
์ธ์ name์ ์ด๋ค ๊ฐ๋ ์ฃผ์ง ์์๊ธฐ ๋๋ฌธ์ name์ undefined์ด๋ฉฐ, undefined๋ false ์ด๋ฏ๋ก ||์ฐ์ฐ์์ ์ํด 'Mark'๋ฅผ ๋ฐํํ๋ค.
function logName(name) { var n = name || "Mark"; console.log(n); } logName(); //logs "Mark"
-
๋จํญ ๋ํ๊ธฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ผ๊น?
MDN Documentation์ ์ํ๋ฉด
+
๋ฅผ ํตํ ๋ณํ์ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ ๊ฐ์ฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ์ด๋ค. ์๋ํ๋ฉด ์ด๋ฏธ ์ซ์์ธ ๊ฒฝ์ฐ, ๊ฐ์ ๋ํ์ฌ ์ด๋คํ ๋์๋ ์ํํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.console.log(+'3'); // logs 3
-
DOM ์ Document Object Model์ ์๋ฏธํ๋ฉฐ HTML ๋ฐ XML ๋ฌธ์๋ฅผ์ํ ์ธํฐํ์ด์ค ( API ) ์ด๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ HTML๋ฌธ์๋ฅผ ์ฒ์ ์ฝ์ ๋(๋๋ ํ์ฑ) ํฐ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. ์ด ๋ HTML ๋ฌธ์๋ฅผ ๊ธฐ๋ฐ์ผ๋กํ๋ ์ด ๊ฐ์ฒด๊ฐ DOM์ด๋ค.
HTML ๋ฌธ์์์ ๋ชจ๋ธ๋ง ๋ ํธ๋ฆฌ์ ๊ฐ์ ๊ตฌ์กฐ๋ผ๊ณ ํ ์ ์์ผ๋ฉฐ, ํ์ด์ง์ ์ฝํ ์ธ ๋ฐ ๊ตฌ์กฐ, ๊ทธ๋ฆฌ๊ณ ์คํ์ผ ๋ฑ์ ๋ํ ์กฐ์์ ๋ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
<html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document Object Model</title> </head> <body> <div> <p> <span></span> </p> <label></label> <input> </div> </body> </html>
-
์ด๋ฒคํธ ์ ํ(event propagation)๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ๊ทธ์์ ์ด๋ฒคํธ๊ฐ ์์ ํ์ ํ๊ทธ์๊ฒ๋ก ์ ํ๋๋ ํ์์ ๋ปํ๋ค. ์ด๋ฒคํธ ์ ํ์๋ ์ธ ๋จ๊ณ๊ฐ ์์ต๋๋ค.
- ์บก์ฒ(Capturing) ๋จ๊ณ - ์ด๋ฒคํธ๊ฐ window๋ก๋ถํฐ ํ๊ฒ ์์๊น์ง ๋ด๋ ค๊ฐ๋ ํ์
- ๋ชฉํ(target) ๋จ๊ณ - ์ด๋ฒคํธ๊ฐ ๋ชฉํ ์์์ ๋์ฐฉํ๋ ๊ฒ
- ๋ฒ๋ธ๋ง(bubbling) ๋จ๊ณ - ์ด๋ฒคํธ๊ฐ ๋ชฉํ์์๋ก๋ถํฐ window๊น์ง ํผ์ ธ๊ฐ๋ ํ์
-
์ด๋ฒคํธ๊ฐ DOM ์์์์ ๋ฐ์ํ์ ๋, ์ด๋ฒคํธ๊ฐ ํ๊ฒ ์์๋ก๋ถํฐ window ๊น์ง ํผ์ ธ๋๊ฐ๋ ํ์์ด๋ค.
์ฝ๋์์ child ์์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ์, child -> parent -> grandparent ์์ผ๋ก ์ด๋ฒคํธ ๋ฒ๋ธ๋ง์ด ๋ฐ์ํ๋ค.
<div class="grandparent"> <div class="parent"> <div class="child">1</div> </div> </div>
-
์ด๋ฒคํธ๊ฐ DOM ์์์์ ๋ฐ์ํ์ ๋, ์ด ์ด๋ฒคํธ๋ ํ๋์ ์์์์๋ง ๋ฐ์ํ์ง ์๋๋ค. Capturing Phase์์๋, ์ด๋ฒคํธ๊ฐ window๋ถํฐ ์์ํ์ฌ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์๊น์ง ์ ํ๋๋ค.
์์ ๊ฐ์ ์์ ๋ก child์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ์, grandparent -> parent -> child ์์ผ๋ก ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค.
<div class="grandparent"> <div class="parent"> <div class="child">1</div> </div> </div>
-
preventDefault()
ํจ์๋ ์์์ ๊ธฐ๋ณธ๋์์ ๋ฐฉ์งํ๋ค. ์๋ฅผ ๋ค์ด form ํ๊ทธ์ ์ด๋ฒคํธ์์ ํด๋น ํจ์๋ฅผ ์คํํ๋ค๋ฉด, submit์ด๋ผ๋ form ํ๊ทธ์ ๊ธฐ๋ณธ๋์์ด ์๋ํ์ง ์๋๋ค.stopPropagation()
ํจ์๋ ์ด๋ฒคํธ ์ ํ๋ฅผ ์ค์งํ๊ฑฐ๋ ๋ฒ๋ธ๋ง ๋๋ ์บก์ฒ๋ง ๋จ๊ณ ์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ๋ค. -
event.defaultPrevented()
๋ผ๋ ์ด๋ฒคํธ ๊ฐ์ฒด์ ์์ฑ์ ํตํด ํ์ธํ ์ ์๋ค. ์์์์ ์ฌ์ฉ๋์๋์ง ์ฌ์ฉ๋์ง ์์๋์ง๋ฅผ ์ด ํจ์์ bool ๋ฆฌํด๊ฐ์ผ๋ก ์ ์ ์๋ค. -
const obj = {}; console.log(obj.someprop.x);
obj ๊ฐ์ฒด์ someprop์ด๋ผ๋ ์์ฑ์ value๋ undefined์ด๋ค. ์๋ํ๋ฉด ๋ฐ๋ก ๊ฐ์ฒด์ ์ ์ธํ์ง ์์๊ธฐ ๋๋ฌธ์ด๋ค. ์ ์ธํ์ง ์์ ์์ฑ์ด๋ ๋ณ์๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ, javascript๋ ์ปดํ์ผ ์๋ฌ๊ฐ ์๋ undefined๋ฅผ ๋ฆฌํดํ๋ค.
undefined์ธ someprop์๊ฒ x๋ผ๋ ์์ฑ์ ํธ์ถ์ ์๊ตฌํ๋ค. ๋น์ฐํ undefined๋ ์์ฑ์ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
-
e.target
์ ์ด๋ฒคํธ๊ฐ ๋ฐ์๋ ํ๊ทธ ๊ทธ ์์ฒด๋ฅผ ์๋ฏธํ๋ค. ์๋ฅผ ๋ค์ด div์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, e.target์ ๊ทธ div๊ฐ ๋ ๊ฒ์ด๋ค.์ฌ๊ธฐ์ three๋ผ๋ ํด๋์ค๋ฅผ ๊ฐ์ง div์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด, target์ threeํด๋์ค์ div๊ฐ ๋๋ค.
<div class="one"> <div class="two"> <div class="three" onClick=""> </div> </div> </div>
-
e.currentTarget
์ ๋์ผํ๊ฒ ์ด๋ฒคํธ์ ๋ํ ํ๊ทธ๋ฅผ ์๋ฏธํ๋, ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ํ๊ทธ์ ์ต์์ (๋ถ๋ชจ) ํ๊ทธ๋ฅผ ์๋ฏธํ๋ค.three์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง๋ง, currentTarget์ one์ด ๋๋ค.
<div class="one"> <div class="two"> <div class="three" onClick=""> </div> </div> </div>
-
==
๋ ์์ ๋น๊ต๋ก์จ, ํผ์ฐ์ฐ์๋ฅผ ์๋์ผ๋ก ํ๋ณํํ์ฌ ๋น๊ตํ๋ค.===
๋ ํ๋ณํ์์ด ๊ทธ๋๋ก ํ์ ๊ณผ ๊ฐ์ ๋น๊ตํ๋ค.== ์ฐ์ฐ์ ๊ฒฝ์ฐ, 254๋ผ๋ ์ซ์๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ์ฌ true๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ค.
254 == '254' // return true 'true' == true // return false true == 2 // return false 254 === '254' // return false
-
let a = { a: 1 }; let b = { a: 1 }; let c = a; console.log(a === b); // logs false even though they have the same property console.log(a === c); // logs true hmm
๊ฐ์ฒด๋ ์ฐธ์กฐ์ ์ํด ํ ๋น๋๊ณ ๋ณต์ฌ๋๊ธฐ ๋๋ฌธ์, ๋ด๋ถ ์์ฑ๊น์ง ๋์ผํด๋ ์ ์ธ์ ๋ฐ๋ก ํ๋ค๋ฉด ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐธ์กฐํ๊ฒ๋๋ค. ์ฐธ์กฐ๋, ๋ฉ๋ชจ๋ฆฌ์์์ ๊ฐ์ฒด์ ์์น๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๋ค.
๋๋ฌธ์ a์ b๋ ๊ฐ์ง ์์ผ๋ฉฐ, c์ ๊ฒฝ์ฐ a์ ์ฐธ์กฐ๋ฅผ ๋๊ฐ์ด ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ true๋ฅผ ๋ฆฌํดํ๊ฒ ๋๋ค.
-
!!์ฐ์ฐ์๋, ์ค๋ฅธ์ชฝ์ ๊ฐ์ bool ํ์ ์ผ๋ก ๊ฐ์ ๋ณํ์ํจ๋ค. ์๋ ์ฝ๋๋ฅผ ์ฐธ๊ณ
console.log(!!null); //logs false console.log(!!undefined); //logs false console.log(!!''); //logs false console.log(!!0); //logs false console.log(!!NaN); //logs false console.log(!!' '); //logs true console.log(!!{}); //logs true console.log(!![]); //logs true console.log(!!1); //logs true console.log(!![].length); //logs false
-
,
๋ฅผ ํตํด ํ์ค์ ์ฌ๋ฌ ํํ์์ ์ํํ ์ ์๋ค. ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ํํ๋ฉฐ, ๋ง์ง๋ง ์ค๋ฅธ์ชฝ ํผ์ฐ์ฐ์์ ๊ฐ์ ๋ฐํํ๋ค.let x = 5; x = (x++ , x = addFive(x), x *= 2, x -= 5, x += 10); function addFive(num) { return num + 5; }
์ผ์ชฝ -> ์ค๋ฅธ์ชฝ์ผ๋ก ์งํ๋๋ฏ๋ก,
x++
์ ๊ฐ์ฅ ๋จผ์ ์ํํ๊ฒ ๋๋ค.x++
๋ก ์ธํด 6 ๋ฐํaddFive(6)
์ํํ์ฌ 11 ๋ฐํx *= 2
์ํํ์ฌ 22 ๋ฐํx -= 5
์ํํ์ฌ 17 ๋ฐํx += 10
์ํํ์ฌ 27 ๋ฐํ
-
๋ณ์ ๋๋ ํจ์์ ์ ์ธ๋ถ๊ฐ ์ฝ๋ ์ต์๋จ์ผ๋ก ๋์ด์ฌ๋ ค์ง๋ ํ์์ ์๋ฏธํ๋ค.
zero๊ฐ ์๋ ์ ์ธ๋์ด์์์๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋ ์ด์ ๋ zero๋ผ๋ ๋ณ์๊ฐ ํธ์ด์คํ ๋์ด ์ต์๋จ์ผ๋ก ์ ์ธ๋ถ๊ฐ ๋์ด์ฌ๋ ค์ง๊ธฐ ๋๋ฌธ์ด๋ค.
console.log(zero); // undefined ( ?? Why ?? ) var zero = 'zero';
var zero; console.log(zero) zero = 'zero';
ํจ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ์ธ๋ถ๊ฐ ํธ์ด์คํ ๋์ด ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค์ง ์๋๋ค.
sayWow(); function sayWow() { console.log('wow'); }
ํ์ง๋ง ํจ์์ ๊ฒฝ์ฐ ํจ์ ํํ์์ผ๋ก ์์ฑํ์ ๊ฒฝ์ฐ, ํธ์ด์คํ ํ์ฌ๋ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๋๋ฐ, ์ด๋ ํจ์ ํํ์์ ๊ฒฝ์ฐ ์ ์ธ๋ถ๋ง ์ฌ๋ผ๊ฐ๋ฒ๋ฆด ์ undefined ๊ฐ์ ๊ฐ์ง๊ฒ๋๋ฉฐ, undefined์ ํจ์ํธ์ถ์ ์ปดํ์ผ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ธฐ ๋๋ฌธ์ด๋ค.
var sayWow; sayWow(); sayWow = function () { console.log('wow'); }
var sayWow; sayWow(); sayWow = function () { console.log('wow'); }
-
Javascript์์์ ์ค์ฝํ๋ ๋ณ์ ๋๋ ํจ์์ ๋ํด์ ์ ํจํ ์ ๊ทผ ๊ถํ์ด ์๋ ์์ญ์ ๋ปํฉ๋๋ค. Javascript์๋ 3๊ฐ์ง ์ ํ์ ๋ฒ์๊ฐ ์๋ค.
์ ์ญ ์ค์ฝํ - ์ ์ญ Space์ ์ ์ธ๋ ๋ณ์ ๋๋ ํจ์. ์ ์ญ ๋ฒ์์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ์ด๋ค ๊ณณ์์๋ ์ ๊ทผ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
//global namespace var g = "global"; function globalFunc(){ console.log('test'); }
ํจ์ ์ค์ฝํ - ํจ์ ๋ด์ ์ ์ธ๋ ๋ณ์ ๋๋ ํจ์. ํจ์ ๋ด๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ฉฐ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์๋ค.
function myFavoriteFunc(a) { var b = 3; return b; } console.log(a); // ReferenceError ๋ฆฌํด. a is not undefined console.log(b); // Error ๋ฆฌํด
๋ธ๋ก ์ค์ฝํ - {} ๋ด์์ ์ ์ธ๋ ๋ณ์. ๋ณดํต let, const๋ก ์ด๋ฃจ์ด์ง ๋ณ์๋ ํด๋น {} ๋ธ๋ก ๋ด์์๋ง ์ ๊ทผํ ์ ์๋ค.
function testBlock(){ if(true) { let z = 5; } return z; } testBlock(); // ReferenceError ๋ฆฌํด "z" is not defined
์ค์ฝํ๋ ๋ณ์๋ฅผ ์ฐพ๊ธฐ ์ํ ๊ท์น์ด ๋๊ธฐ๋ ํ๋ค. ๋ณ์๊ฐ ํ์ฌ ์ค์ฝํ ์์ ์กด์ฌํ์ง ์์ผ๋ฉด ์ธ๋ถ ์ค์ฝํ์์ ๋ณ์๋ฅผ ์ฐพ์์ ๊ฒ์ํ๊ณ ๋ค์ ์กด์ฌํ์ง ์์ผ๋ฉด ์ ์ญ๋ฒ์์ ๋์ฐฉํ ๋๊น์ง ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ๋ง์ฝ ๋ณ์๋ฅผ ์ฐพ๊ฒ ๋๋ค๋ฉด ํ์์ ์ค์งํ๊ณ ์ ์ญ์ค์ฝํ๊น์ง ์งํํด์ ์ฐพ์ง ๋ชปํ๋ค๋ฉด ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค. ์ด๋ฌํ ๊ณผ์ ์ ์ค์ฝํ ์ฒด์ธ(Scope Chain)์ด๋ผ๊ณ ํ๋ค.
-
ํด๋ก์ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์ ์ ์ธ ์ ์์ฑ๋ ์ค์ฝํ๋ก์จ, ์ ์ธ ๋น์์ ํจ์๊ฐ ์ค์ฝํ ์ฒด์ธ์ ๋์์ผ๋ก ์ ์ญ ๋ฒ์์ ๋๋ฌํ ๋๊น์ง ํ์ฌ ํจ์์ ๋ํ ๋ณ์ ๋ฐ ๋งค๊ฐ๋ณ์ ํจ์ ๋ฑ์ ์ฐธ์กฐ๋ฅผ ๊ธฐ์ตํ๋ ๊ธฐ๋ฅ์ด๋ค. ์์ ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๋ ํ๊ฒฝ์ ์๋ ํจ์๊ฐ ํด๋ก์ ๋ค. ์ฌ๊ธฐ์ ์์ ๋ณ์๋ ํด๋ก์ ํจ์ ๋ด๋ถ์ ์์ฑํ ๋ณ์๋ ์๋๊ณ , ๋งค๊ฐ๋ณ์๋ ์๋ ๋ณ์๋ฅผ ์๋ฏธํ๋ค. ํด๋ก์ ๋ฅผ ๋งํ ๋๋ ์ค์ฝํ/์ปจํ ์คํธ/์์ ๋ณ์์ ํจ์์ ๊ด๊ณ๋ฅผ ๊ฐ์ด ์ค๋ช ํด์ฃผ์ด์ผํ๋ค.
์์ค์ฝ๋์์ name์ ํด๋ก์ ํจ์์ ํ๋ผ๋ฏธํฐ๋ ์๋๊ณ , ํด๋ก์ ํจ์ ๋ด๋ถ์์ ์์ฑํ ๋ณ์๋ ์๋๋ค. ์ด๊ฒ์ ์์ ๋ณ์๋ผ๊ณ ํ๋ค.
var makeClosure = function() { var name = 'test'; return function () { console.log(name); } }; var closure = makeClosure(); // function () { console.log(name); } closure(); // 'test';
์ด๊ฒ์ ์ปจํ ์คํธ๋ก ์ฐธ๊ณ ํ๋ฉด ์๋ ์์ค์ฝ๋์ ๊ฐ์ด ๋ณผ ์ ์๋ค.
closure = makeClosure()
๋ก ์ธํ์ฌ ํด๋น ์ปจํ ์คํธ๋ ์ ์ญ์ปจํ ์คํธ์makeClosure
ํจ์์ ์ปจํ ์คํธ์ ๋ณ์๊ฐ์ฒด๋ฅผ ํฌํจํ๊ฒ ๋๋ค. ๋๋ฌธ์ ์ค์ฝํ์ฒด์ธ์ ํตํด makeClosure์ ์๋ ๋ณ์ (์์ ๋ณ์) name์ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค."์ ์ญ ์ปจํ ์คํธ": { scopeChain: ['์ ์ญ ๋ณ์๊ฐ์ฒด'], } "makeClosure ์ปจํ ์คํธ": { scopeChain: ['makeClosure ๋ณ์๊ฐ์ฒด', '์ ์ญ ๋ณ์๊ฐ์ฒด'], } "closure ์ปจํ ์คํธ": { scopeChain: ['closure ๋ณ์๊ฐ์ฒด', 'makeClosure ๋ณ์๊ฐ์ฒด', '์ ์ญ ๋ณ์๊ฐ์ฒด'], }
-
ํด๋น ์๋ฃํ๊ณผ ๊ฐ๋ค์ด ๊ธฐ๋ณธ์ ์ผ๋ก false ๊ฐ์ ๊ฐ์ง๋ค.
const falsyValues = ['', 0, null, undefined, NaN, false];
-
๊ฐ์ !!์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ธํ ์ ์๋ค.
-
use strict
๋ Javascript์ ES5 ๊ธฐ๋ฅ ์ค ํ๋์ด๋ฉฐ ํจ์ ๋๋ ์ ์ฒด Script์์ ์ฝ๋๋ฅผ ์๊ฒฉํ๊ฒ ๋ง๋ค์ด์ค๋๋ค. ์ด๋ ์ฝ๋ ์ด๊ธฐ์ ๋ฒ๊ทธ๋ฅผ ํผํ ์ ์๊ณ ์ฝ๋์ ๋ํ ๊ท์ ๋ฅผ ์ถ๊ฐํ๋ค.- ์ ์ธ๋์ง ์์ ๋ณ์์ ํ ๋น์ ๋ง๋๋ค.
function returnY() { 'use strict'; y = 123; return y; }
- ์ฝ๊ธฐ ์ ์ฉ ๋๋ ์ฐ๊ธฐ ๋ถ๊ฐ๋ฅํ ์ ์ญ ๋ณ์์ ๊ฐ ํ ๋น์ ๋ง๋๋ค.
'use strict'; var NaN = NaN; var undefined = undefined; var Infinity = 'and beyond';
- ํ๋ผ๋ฏธํฐ ๋ณ์ ์ด๋ฆ์ ์ค๋ณต์ ๋ง๋๋ค.
'use strict'; function someFunc(a, b, b, c){}
- eval ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋ง๋๋ค.
'use strict'; evel('var x = 1;'); console.log(x) // Throws a Reference Error :: x is not defined
-
๊ธฐ๋ณธ์ ์ผ๋ก this๋ ํ์ฌ ์คํ ์ค์ด๊ฑฐ๋ ํธ์ถํ๋ ํจ์์ ๊ฐ์ฒด ๊ฐ์ ๋ํ๋ธ๋ค. ๋๋ฌธ์ ์ ์ญ ์ปจํ ์คํธ ์ํ์์ this๋ window๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ํ์ง๋ง ํน์ ๊ฐ์ฒด ๋ด์์๋ window๊ฐ ์๋ ํน์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ์ฆ, ์ฌ์ฉ๋๋ ์ปจํ ์คํธ์ ๋ฐ๋ผ this๊ฐ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด ๋ณํ๋ค.
์ด๊ฒ์
carDetails
์ด๋ผ๋ ๊ฐ์ฒด ๋ด๋ถ์์ this๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ Ford Mustang๋ฅผ ๋ฆฌํดํ๋ค๋ ๊ฒ์ ์ฝ๊ฒ ์ ์ ์๋ค. this๊ฐcarDetails
๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ด๋ค.const carDetails = { name: "Ford Mustang", getName(){ return this.name; }, }; console.log(carDetails.getName()); // logs Ford Mustang
ํ์ง๋ง ์ด์๊ฐ์ ์ฝ๋์์๋ ์กฐ๊ธ ๋ค๋ฅด๋ค.
getCarName
๋ณ์์ this.name์ ๋์ ์ํค๊ณ ํธ์ถ์์ผ๋ณด์๋๋ฐ ์ ์ญ ๋ธ๋ก๋ด์Ford Ranger
๊ฐ ํธ์ถ๋๋ค. ์ด๋getCarName
์ด๋ผ๋ ๋ณ์๊ฐ ์ ์ญ ๋ธ๋ก์ ์๊ธฐ ๋๋ฌธ์ด๋ค. this๋ window๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๊ณ window์์ this.name์ดFord Ranger
์ด๋ค.var name = "Ford Ranger"; var getCarName = carDetails.getName; console.log(getCarName()); // logs Ford Ranger
ํด๋น ์ฝ๋์์๋
guessThis()
์thisIsAnnoying()
์ด ๋ชจ๋ 'test'๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. this๋ ํธ์ถ๋ ์์ ์ ์ปจํ ์คํธ๋ฅผ ๊ฐ๋ฆฌํค๊ฒ๋๋ค. ์๋ฌด๋ฆฌ ๋ด๋ถ์getThis()
๊ฐ ์๊ฑฐ๋myFavoriteObj
๊ฐ์ฒด์์ ์์๋ฌ๊ฑฐ๋ ํด๋ ํธ์ถํ ์ปจํ ์คํธ๊ฐ ์ ์ญ ์ปจํ ์คํธ์ด๋ฏ๋ก this๋ window๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.var name = 'test'; const myFavoriteObj = { guessThis(){ function getThis(){ console.log(this.name); } getThis(); }, name: 'Marko Polo', thisIsAnnoying(callback){ callback(); } }; myFavoriteObj.guessThis(); //logs the "window" object myFavoriteObj.thisIsAnnoying(function (){ console.log(this.name); //logs the "window" object });
์ฌ๊ธฐ์ ๊ฐ์ฒด ๋ด๋ถ์ name์ ํธ์ถํ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋
guessThis()
ํจ์ ๋ด๋ถ์ ๋ณ์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ guessThisํจ์ ๋ด์ this๋ myFavoriteObj๋ฅผ ๊ฐ๋ฆฌํค๊ณ getName()ํจ์์ this๋ window๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋๋ฐ, ์ด๋ ํจ์ ํธ์ถ ์์ this๊ฐ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด๊ฐ ๋์ ์ผ๋ก ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฐํmyFavoriteObj.guessThis()
๋ฅผ ํธ์ถํ๊ธฐ์ javascript์์ this๋ฅผ ํด๋น ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋ฐ์ getName()์ ๋จ์ํ window๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ ๊ฒ์ด๋ค.๋๋ฌธ์ guessThis() ์์์ this๋ฅผ ๋ณ์์ ํ ๋นํ์ฌ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๋ด๋ถ์ name์ ํธ์ถํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
const myFavoriteObj = { guessThis(){ const self = this; function getName(){ console.log(self.name); } getName(); }, name: 'Marko Polo', thisIsAnnoying(callback){ callback(); } }; myFavoriteObj.guessThis();
๋๋ฒ์งธ ๋ฐฉ๋ฒ์ ES6 `Arrow Function`์ ์ ์ธํ๋ ๊ฒ์ด๋ค. Arrow Function์ ์ฌ์ฉํ๋ฉด ํจ์ ์์ this๋ ์์ scope์ this๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ๊ธฐ๋ณธ ํจ์ ์ ์ธ์ this๊ฐ ๋ฐ์ธ๋ฉํ ๊ฐ์ฒด๊ฐ ๋์ ์ผ๋ก ๊ฒฐ์ ๋์ง๋ง, Arrow ํจ์์ ๊ฒฝ์ฐ๋ ์ ์ ์ผ๋ก ๊ฒฐ์ ๋๋ค. ํญ์ ์์ scope์ this๋ฅผ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ ๊ฒ ์์์ scope๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์ (Lexical this) ๋ผ๊ณ ํ๋ค.const myFavoriteObj = { guessThis(){ const getName = () => { console.log(this.name); } getName(); }, name: 'Marko Polo', thisIsAnnoying(callback){ callback(); } };