๊ณผ์
๋จผ์ ์ดํด ๋ณผ ํจ์๋
calculatorWinner() -> ์น์ ํ๋ณํ๋ ํจ์. ์ด๋ป๊ฒ ์น์ํ๋ณํ๋์ง ์ ํ์ ํด๋ณด์.
๋ฐฐ์ด ์ด๋ป๊ฒ ๋๊ฒจ์ฃผ๊ณ ํ๋๊ฑด ๊ทธ ๋ค์.
๊ทธ๋ฆฌ๊ณ ์น์ํ๋ณ์ ์ธ์ ํด์ผ๋๋๋? ์ด ํ์ด๋ฐ์ ์ ์๊ฐํด๋ณด์.
Q. ๊ณผ์ ์์ css :before, :after ์ ํ์ ์ด๋ค์ญํ ?
css์๋ box-sizing์ด๋ผ๋ ์์ฑ์ด ์๋๋ฐ,
๋ธ๋ก ์์๋ ์์์๋ถํฐ padding, border, margin์ ์์๋๋ก ์กด์ฌ.
๊ทผ๋ฐ, box-sizing ์์ฑ์ ๋ฐ๋ผ ์ด๋ฌํ ๊ฐ๋ค์ ๋ํ ๊ฐ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
๊ณผ์ ์์ box-sizing: inherit; ์์ฑ์ ๊ฐ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด๊ฒ ์๋ํ ์ ์๋ box-sizing์์ฑ์ ์ผ๊ด๋๊ฒ ๋ง์ถฐ์ค๋ค๊ณ ๋ณด๋ฉด ๋จ.
Reset-css
๋ธ๋ผ์ฐ์ ๋ณ๋ก ๋ด์ฅ๋์ด์๋ css ์ค์ ๊ฐ(h1์ ํฌ๊ธฐ์ฐจ์ด ๋ฑ)์ ๋ค๋ฅผ ์ ์๊ธฐ๋ค. ๊ฐ ๋ธ๋ผ์ฐ์ ๋ณ๋ก ๋ค๋ฅธ ์ค์ ๊ฐ๋ค์ ๋ง์ถฐ์ฃผ๊ธฐ์๋ ํ๋๋ฏ๋ก ๋ชจ๋ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ณธ css ์ค์ ๊ฐ์ ์์ ์ ์ฒ์๋ถํฐ ์ผ๊ด๋๊ฒ ๊ฐ๋ฐํ๊ธฐ ์ํด ์ด๋ค.
Q. calculateWinner ํจ์๋ถ๋ถ
if (squares[a] && squares[a] === squares[b] && squares[a] === squares[c])
Q. ์์ squares[a] && squares[a] ๋ ํญ์ ๊ฐ์ ๊ฒ ์๋๊ฐ?
์ด ๋ถ๋ถ์์๋ 3ํํธ๊ฐ ์๋๋ฐ,
์ผ๋จ ์ฌ๊ธฐ์ ๋น๊ต์ฐ์ฐ์ ===
์ฐ์ ์์๊ฐ &&
์ฐ์ฐ์๋ณด๋ค ํฌ๋ค
๊ทธ๋์ ๋จผ์ ===
์ฐ์ฐ์๊ฐ ์ํ๋๊ณ ๋ ํ์ &&
์ฐ์ฐ์๊ฐ ์๋๋๋๋ฐ ์ด๋ ์ฐ๋ฆฌ๊ฐ ์ ๋ฒ์ฃผ์ฐจ Operator Truthy Falsy์์ ๋ดค๋ ๋
ผ๋ฆฌ์ฐ์ฐ์.
&&
์ฐ์ฐ์๋ Falsy๋ฅผ ์ฐพ๋ ์ฐ์ฐ์๋ผ๊ณ ๋ณด๋ฉด ๋๋๋ฐ,
if (squares[a] && ~~ )
์ ๊ฐ์ด ๋๋ฉด์, squares[a]๊ฐ Falsy์ธ์ง ์๋์ง ์ ๋ฌด๋ฅผ ํ๋จํ๋ ๊ฒ. ๋ ์์ธํ ๋งํ๋ฉด squares[a]๊ฐ ์กด์ฌํ๋์ง ์กด์ฌํ์ง ์๋์ง๋ฅผ ํ๋ณํ๋ ๊ฒ
์ข ๋ ๋ํ ์ผํ ์๋ฅผ ์ดํด๋ณด๋ฉด,
var arr = [
{
title: "vanilla coding"
}
];
if (arr[0].title) {
// ToDo..
}
๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋ ๋ฌธ์ ๋ ๊ฒ์ด ์๋ค.
ํ์ง๋ง
var arr = [
/*
{
title: "vanilla coding"
}
*/
];
if (arr[0].title) {
// ToDo..
}
๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋ arr[0]์ด ์กด์ฌํ์ง ์์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
arr[0]์ด ์กด์ฌํ์ง ์๊ธฐ๋๋ฌธ์ undefined๊ฐ ๋๊ณ ,
undefined.title์ด ๋๋ฉด์ ์ ๋ฌ๊ฐ ๋๋ค.
undefined๋ ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ dot notation์ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋์ ์ด๋ด๋, ๊ฐ๋จํ๊ฒ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด์ ์ด๋ฌํ ์ ๋ฌ๋ฅผ ๋ง์ ์ ์๋๋ฐ,
var arr = [];
if (arr[0] && arr[0].title) {
// ToDo
}
๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ์ธ๋ฑ์ฑ์ํ๊ณ ์์ฑ์ ์ฐธ์กฐํ๋ ๊ตฌ๋ฌธ ์์ arr[0] && ์ ๋ฃ์ด์ arr[0]์ ๊ฐ์ด falsy์ธ์ง ํ์ธ ํ ํ์ ์งํํ๋๋ก ํ๋ ๊ฒ.
arr[0]์ด falsy๋ฉด false๊ฐ์ผ๋ก if๋ฌธ์ ๋ฒ์ด๋๋ค.
Q. ์คํฌ๋ฆฝํธ์์ console.log์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์๋๊ตฌ์์ console.log
Q. ์คํฌ๋ฆฝํธ์์ console.log์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์๋๊ตฌ์์์ console.log๋ก ๋๊ฐ์ ๋ณ์๋ฅผ ์ฐ์ผ๋ฉด ์๋ค๊ณ ํจ.
์ด ๋ฌธ์ ๋ ์ฐ๋ฆฌ๊ฐ parcel ๋ชจ๋์ ์จ์ ๊ทธ๋ผ.
parcel๋ก ๋น๋ํ๋ฉด ์คํฌ๋ฆฝํธ์์ ์์ฑ๋ ๋ณ์๋ช ์ด๋ ์ด๋ฐ๊ฒ๋ค์ด ๋ณํ๋์ด์(๋ณดํธ?) ๋น๋๋๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์ฝ์์ด ์ฐํ์ง ์๋๋ค.
๋ฐ๋ผ์ Console.log๋์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ๋๋ฒ๊น ํด๋ณด์
getElementByClassName ์ ์์ฌํญ
๋ง์ฝ, getElementByClassName์ผ๋ก Element๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒฝ์ฐ, ์ ์ฌ๋ฐฐ์ด์ ํํ๋ก ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
HTMLCollection
๊ทธ๋์ ์ฃผ์ํด์ผ๋๊ณ , ๋ฐฐ์ด์ฒ๋ผ ๋ค๋ค์ค์ผ ๋๋ค.
๋ฐฐ์ด๊ณผ ๊ฐ์ด [] indexing์ ํด์ค์ผ ํจ.
์ ์ ์ฌ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ค๋๋ฉด ClassName์ ๊ฐ์ ClassName์ ๊ฐ์ง๊ณ ์๋ Element๊ฐ ์ฌ๋ฌ๊ฐ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ๊ฐ๋ฅผ ๊ฐ์ ธ ์ค๋๋ก ํด์ผ ๋๊ธฐ ๋๋ฌธ.
๋ฐ๋๋ก id๋ page์ ํ๋๋ง ์์ด์ผ ๋๋ฏ๋ก
getElementById()
๋ก ๊ฐ์ ธ์ค๋ ๊ฐ์ ๋ฐ๋์ ํ๋์ธ ๊ฒ.
์ฝ๊ฒ ์ดํดํ ๋ ค๋ฉด, nodeList, htmlElementList๋ฑ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
event ๊ฐ์ฒด
element.addEventListener("click", function (event) {
// ToDo
})
์ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ฐ๋ event๊ฐ์ฒด๋ event์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ๊ฐ์ฒด!
event ๊ฐ์ฒด์์ target ๊ณผ currentTarget ์ฐจ์ด?
event ๊ฐ์ฒด์์, target์ event๊ฐ ์ค์ ๋ก ์ผ์ด๋๋ element๋ผ๊ณ ๋ณด๋ฉด๋๊ณ ,
click์ด๋ฒคํธ๋ฉด ์ค์ clickํ element
event.currentTarget์ event๊ฐ ์ค์ ์ฅ์ฐฉ๋ element๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
click ์ด๋ฒคํธ๋ฉด element.addEventListener() ๋ก ์ค์ ์ด๋ฒคํธ ๋ฑ๋กํ element
์๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์์๋ target๊ณผ currentTarget์ ๊ฐ์ ๊ฒ ๊ฐ๋ค.
ํ์ง๋ง ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋๋ฐ,
<div class="outer">
<div class="inner">
</div>
</div>
๋ค์๊ณผ ๊ฐ์ด outer์ ์ด๋ฒคํธ๋ฅผ ์ถ๊ฐํ๋ฉด, ์์์ธ inner์๋ ํด๋น ์ด๋ฒคํธ๊ฐ ๋ฐ์์ด ๋๋ค.
๊ทผ๋ฐ, inner์์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋
target๊ณผ currentTarget์ด ๋ฌ๋ผ์ง ์ ์๋ค.
target : inner currentTarget : outer
๋ฐ๋ก event๋ฅผ ์ถ๊ฐํ element ๋ด๋ถ์ ์กด์ฌํ๋ element๊ฐ ์์ ๋, ์ด element์์ event๊ฐ ๋ฐ์๋์์ ๋,
๋ค์ ๊ฒฐ๊ณผ๋?
var a = 3;
function foo() {
var a = 2;
console.log(a); // 2 ์ถ๋ ฅ ๋์ผ ํจ์ scope์ a๋ณ์ ์กด์ฌ
}
foo();
console.log(a); // 3 ์ถ๋ ฅ
์ฌ๊ธฐ์ Scope๋
Global Scope
- a = 3
- function foo
foo ํจ์ Scope
- a = 2
๋ค์ ๊ฒฐ๊ณผ๋?
var a = 3;
function foo() {
console.log(a); // undefined
var a = 2;
}
foo();
๋ค์๊ณผ ๊ฐ์ ์ํฉ์์๋
fooํจ์๋ด๋ถ์์ console.log(a)๊ฐ ์คํ ๋๊ธฐ ์ด์ ์ a๊ฐ ์ ์ธ์ด ๋จผ์ ๋๊ณ (๊ฐ๋ง ํ ๋น๋์ง ์์ ์ํ)๋ก Hoisting์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ.
Hoisting์ผ๋ก a๋ณ์๊ฐ ์กด์ฌํ๊ธด ํ๋ ๊ฐ์ ํ ๋น๋์ง ์์ ์ํ์์ console.log(a)๊ฐ ์คํ ๋ ๊ฒ.
๊ทธ๋์ javascript ๋ด๋ถ์ ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์๋ํ๋ค๊ณ ๋ณด๋ฉด ๋๋ค.
var a = 3;
function foo() {
var a; // undefined
console.log(a);
a = 2;
}
foo();
์ค์ ๋ก ์ด๋ ๊ฒ ๋ฐ๋๋๊ฑด ์๋๊ณ , ๋ด๋ถ์ ์ผ๋ก ์๋ํ๋ค๊ณ ์์๋์.
๋ค์ ๊ฒฐ๊ณผ๋?
var a = 5;
for (var i = 0; i < a; i++) {
console.log(a);
}
console.log(i); // 5
i๊ฐ 5๊น์ง ๊ฐ๋ค์ for ์กฐ๊ฑด๋ฌธ์ ํ์ถํ๊ธฐ ๋๋ฌธ.
๋ค์ ๊ฒฐ๊ณผ๋?
var a = 1;
function bar() {
function foo() {
console.log(a); // 2์ถ๋ ฅ
}
a = 2;
foo();
}
bar();
์คํ ์์๋ฅผ ํ์ ํ๋ฉด ๋ต์ ์ฝ๋ค.
fooํจ์๊ฐ ์คํ๋๊ธฐ ์ง์ ์ ์ด๋ฏธ a = 2๋ก ๋ฐ๊พธ์ด ๋์๊ธฐ ๋๋ฌธ.
์์ ์ฝ์์ ๋ณต๋ถ ํ๋๋ฐ undefined?
console.log() ์ฐ์ ๊ฒ ๋ง๊ณ ๋ ์ฝ์์ undefined๊ฐ ๋์ค๋๋ฐ ์ด๋ ๋ณต๋ถํ ์์ค์ฝ๋์ ๋ฆฌํด๊ฐ.
ํจ์ ์ ์ธ์ ๊ฒฐ๊ณผ๊ฐ์ undefined.
๊ฐ์ Scope์์ ๋ณ์ ๊ณ์ ์ ์ธ?
function prep() {
var value = 1;
// ToDo
var value = 2; // ์ด๋ ๊ฒ ํ์ง๋ง์.
// ๊ฐ์ Scope์์๋ ์ฌ์ ์ธ ํ์ง๋ง๊ณ ์ด๋ฏธ ๋ง๋ค์ด์ง ๋ณ์๋ฅผ ํ์ฉํ๋ฉด ๋จ.
value = 3;
function inner() {
var value = 5; // ๋ค๋ฅธ Scope์์๋ ํด๋ ์๊ด X.
}
}
ํธ์ด์คํ ์์
// var a; <- Hoisting
function bar() {
console.log(a); // undefined
}
bar();
var a = 1;
์ ์ญ๋ณ์ = ๊ฐ์ฒด๊ฐ์ฒด ์์ฑ. ๊ทธ๋ผ delete?
delete window.something // false
์ ์ญ ๊ฐ์ฒด์์์ ์์ฑ ์ญ์ ๋ ์๋๋ค.