JavaScript ํต์ฌ์์ฝ
1.2 ์ถ๋ ฅ๊ณผ ์ ๋ ฅ
์ถ๋ ฅ
window : ๋ธ๋ผ์ฐ์
document : ๋ธ๋ผ์ฐ์ ์ ๋ก๋ฉ๋ html
window.alert(์ถ๋ ฅํ ๋ด์ฉ)
: ๋ธ๋ผ์ฐ์ ์ ๊ฒฝ๊ณ ์ฐฝ์ ์ถ๋ ฅ
console.log(์ถ๋ ฅํ ๋ด์ฉ)
: ๋ธ๋ผ์ฐ์ ์ ์ฝ์์ ์ถ๋ ฅ
document.write()
- ๊ธฐ์กด ๋ด์ฉ์ ๋ค ์ญ์ ํ๊ณ ์ ๋ ฅํ๋ค.
- ๋ฌธ์๋ฅผ ์์ ์๋ก ๋ง๋ค ๋๋ง ์ฌ์ฉ. ํจ๋ถ๋ก ์ฌ์ฉํ๋ฉด ์๋จ. ๊ฑฐ์ ์ฌ์ฉํ ์ผ X
innerHTML
$0 <h1>Hello</h1> $0.innerHTML 'Hello' $0.innerHTML = 'World'; 'World' $0.innerHTML = '<span>Hi</span>' // h1 ํ๊ทธ inner์ span ํ๊ทธ ์ฝ์ '<span>Hi</span>'
textContent
$0.textContent = '<span>Hi</span>' // $0(h1ํ๊ทธ)์ ๋ด์ฉ์ <span>Hi</span>๋ก ๋ฐ๊พผ๋ค. '<span>Hi</span>'
- innerHTML๊ณผ textContent์ ์ฐจ์ด
textContent๋ innerHTML๊ณผ ๋ฌ๋ฆฌ ํ๊ทธ๋ฅผ ๋ฌธ์์ด๋ก ์ธ์ํ๋ค.
- innerHTML๊ณผ textContent์ ์ฐจ์ด
์ ๋ ฅ
window.confrim(๋ฉ์์ง)
ํ์ธ์ฐฝ ์ ๋ ฅ ์ โ true, ์๋์ค โ false
window.prompt(โ์ ๋ชฉโ, โ๋ด์ฉโ)
์ ๋ ฅํ ๋ด์ฉ ๋ฌธ์์ด๋ก ๋ฐํ
1.3 ์๋ฃํ(Data Types)
- typeof ์ฐ์ฐ์๋ก ๋ณ์๋ ๋ฆฌํฐ๋ด์ ํ์
ํ์ธ ๊ฐ๋ฅ
๊ฐ์ฒด์ typeof โ obejct
+) ๊ฐ์ฒด์ ํ์ ํ์ธ ์ instanceof ์ฐ์ฐ์ ์ฌ์ฉ
typeof 1 // 'number' typeof 'abc' // 'string' typeof [] // 'object' typeof function() {} // 'function'
- true๋ก ํ๊ฐ๋๋ ๊ฐ : false๊ฐ ์๋ ๊ฐ ์ ๋ถ
false๋ก ํ๊ฐ๋๋ ๊ฐ : 0, -0, โโ, null, false, NaN, undefined
โป !! ์ฐ์ฐ์ ๊ฒฐ๊ณผ๊ฐ false๋ผ๋ฉด, false๋ก ํ๊ฐ๋๋ ๊ฐ์ด๋ค.
!!1 // true !!0 // false !! [] // true ๋น ๋ฐฐ์ด !! {} // true ๋น ๊ฐ์ฒด !!'0' // false์ผ ๊ฒ ๊ฐ์ง๋ง true์ด๋ค.
- null VS undefined
null์ ์ฐธ์กฐ๋ณ์์ ๋ฃ๋ ๊ฒ. ์ฐธ์กฐํ์ undefined์ ???(์ฐธ์กฐ๊ฐ๋ ์ง ๊ธฐ๋ณธ์ด ๋ ์ง ๋ชจ๋ฆ)
๋๋ถ๋ถ undefined๋ค.
1.5 ํธ์ด์คํ (hoisting)
- ๋ณ์๋ ํจ์์ ์ ์ธ์ด ํด๋น ๋ฒ์(scope)์์ ์ต์๋จ์ผ๋ก ์ฎ๊ฒจ์ง๋ ๊ฒ
num = 6;
console.log(num); // 6
console.log(num2); // undefined
var num; // OK
var num2 = 10;
console.log(num2); // 10
catName("Chloe");
function catName(name) {
console.log("cat's name = " + name);
}
โ
var num; // OK
var num2; // var num2 = 10; -> var num2 ์๋ง ์ฌ๋ผ๊ฐ๋ค.
function catName(name) {
console.log("cat's name = " + name);
}
num = 6;
console.log(num); // 6
console.log(num2); // undefined
num2 = 10;
console.log(num2); // 10
catName("Chloe");
1.6 ๋ณ์์ ๋ฒ์(scope)
JS์์์ ๋ณ์์ ์ข ๋ฅ
- ์ ์ญ : ์ง์ญ ๋ณ์๊ฐ ์๋ ๊ฒ
- ์ง์ญ : ํจ์ ๋ด๋ถ
<๋ณ์์ ์ข ๋ฅ>
ES5 : var
ES6 : let(๋ณ์), const(์์) โ ์ด๊ฑฐ ์ฌ์ฉํ๊ธฐ
- ์ ์ญ ๋ณ์
์ ์ญ ๋ณ์๋ window(๋ธ๋ผ์ฐ์ )์ ์์ฑ์
์ ์ธํ์ง ์๊ณ ์ฐ๋ฉด ์ ์ญ ๋ณ์๊ฐ ๋๋ค.
var x = 10; // ์ ์ญ๋ณ์ x ์ ์ธ var x = 5; // ์ค๋ณต ์ ์ธ ๊ฐ๋ฅ. ๋ง์ง๋ง ์ ์ธ๋ง ์ ํจ x = 3; // var x = 3;๊ณผ ๋์ผ ์ ์ญ๋ณ์ - ์ด๋ค Scope์์๋ ์ง ์ธ ์ ์์ ใด console.log(x); // 3 console.log(window.x); // 3
- ์ง์ญ ๋ณ์
function sum(a, b) { var result = 0; // ์ง์ญ๋ณ์ gResult = 0; // ์ ์ญ๋ณ์ window.gResult = 0; // var i;๋ ์๊ธฐ scope์ ์ต์๋จ์ผ๋ก ์ฌ๋ผ๊ฐ for (var i = 0; i < arguments.length; i++) { gResult += arguments[i]; } console.log(i); // OK } sum(3, 5); // console.log(result); // ์๋ฌ console.log(gResult); // 8 console.log(window.gResult); // 8
<JS ๊ณต๋ถ ๋ฐฉ๋ฒ>
- ๋ฌธ์์ด
- JS์ JAVA์์ ๊ฐญ
๋๋จธ์ง๋ ์ค์ ์์ ํ์ํ ๋ ์ฑ์๋๊ฐ๊ธฐ ์ค๋ ๋ถ์ก๊ณ ์๋ ๊ฒ์ ์ข์ง ์๋ค. ํต์ฌ๋ง ์๊ณ ๋์ด๊ฐ๋ฉด ๋๋ค.
1.7 ํ๋ณํ(Type conversion)
์ซ์๋ก ๋ณํ : Number(), parseInt(), parseFloat(), *1
- Number()
var x = Number(true); // true -> 1 var x = Number("true") // "true" -> NaN var x = Number("123") // "123" -> 123 var x = Number("123px") // "123px" -> NaN
- parseInt()
Number()๋ณด๋ค๋ parseInt()๋ฅผ ์ฐ๋ ๊ฒ ์์ ํ๊ณ ์ค์ ๋ก ๋ง์ด ์ฌ์ฉํ๋ค.
var x = parseInt(true); // true -> NaN var x = parseInt("true") // "true" -> NaN var x = parseInt("123") // "123" -> 123 var x = parseInt("123px3") // "123px3" -> 123 parseInt๋ ํด์ํ ์ ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ ๋๋ธ๋ค.
- parseFloat()
var x = parseFloat("-1e3") // -1000 var x = parseFloat("1"); // 1
- *1 (String โ Number)
var x = "22" * 1; typeof x // 'number'
๋ฌธ์๋ก ๋ณํ : String(), toString()
var num = 22;
var x = String(num); // '22'
var x = num + ""; // '22' ์ด๊ฑฐ ์ฌ์ฉํ ๊ฒ
var x = num.toString(); // '22'
var x = (123).toString(); // '123' ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ()๋ก ๋ฌถ์ด์ค์ผ ํ๋ค. ์ผ์์ ์ธ ๊ฐ์ฒดํ
boolean์ผ๋ก ๋ณํ : Boolean(), !!
var num = 123;
var x = Boolean(num); // true
var x = Boolean(0); // false
var x = Boolean("0") // true
var x = !!123; // true ์ด๊ฑฐ ์ฐ๊ธฐ
2.2 toExponential(), toFixed(), toPrecision()
- ์ง์ ๋ ์์์ ์๋ฆฌ์์์ ๋ฐ์ฌ๋ฆผ ๊ฒฐ๊ณผ๋ฅผ ๋ฌธ์์ด๋ก ๋ฐํ
x.toExponential(2); // '9.66e+0' x.toExponential(4); // '9.6560e+0' x.toExponential(6); // '9.656000e+0'
var x = 9.656; x.toFixed(0); // 10 x.toFixed(2); // 9.66 x.toFixed(4); // '9.6560' x.toFixed(6); // '9.656000'
var x = 9.656; // ์ ๋ฐ๋? x.toPrecision(); // '9.656' x.toPrecision(2); // '9.7' x.toPrecision(4); // '9.656' x.toPrecision(6); // '9.65600'
3. ๋ฐฐ์ด
- Java์ ๋ฌ๋ฆฌ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๊ฐ๋ฅํ๋ค.
- ๋ฐฐ์ด ์์ฑ
arr = []; // ๋น ๋ฐฐ์ด ์์ฑ. ์๋์ ๊ฐ์ ์๋ฏธ. ๋๊ฐ์ผ๋ ๊ตณ์ด ์๋์ฒ๋ผ ์ธ ํ์ X arr = new Array(); arr = new Array(10); // ํฌ๊ธฐ๋ฅผ ์ง์ ํด์ผ ํ ๋๋ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
- ๊ฐ์ฒด ์์ฑ
obj = {}; // ๋น ๊ฐ์ฒด ์์ฑ. ์๋์ ๊ฐ์ ์๋ฏธ. ๋๊ฐ์ผ๋ ๊ตณ์ด ์๋์ฒ๋ผ ์ฐ์ง๋ง๊ณ obj = {};๋ก ์์ฑํ์. obj = new Object();
- ํ๋์ ๋ฐฐ์ด์ ์ฌ๋ฌ ํ์
์ ๊ฐ์ ์ ์ฅํ ์ ์๋ค.
var arr = [1, 2, 3, 4, 5]; arr[6] = 100; arr // [1, 2, 3, 4, 5, empty, 100] arr[5] // undefined arr.length // 7 for (var i = 0; i < arr.length; i++) console.log(arr[i]); // 1 2 3 4 5 undefined 100 for (i in arr) console.log(arr[i]); // 1 2 3 4 5 100 / undefined๋ ์ถ๋ ฅ ์ ํจ
- ๋ฐฐ์ด๋ ๊ฐ์ฒด์ด๋ฉฐ, new ์ฐ์ฐ์๋ก ์์ฑํ ์ ์๋ค.
var arr = new Array(1, 2, 3, 4, 5); // var arr = [1, 2, 3, 4, 5]; var arr = new Array(40); // 40๊ฐ์ undefined ์์๋ค์ด ์ ์ฅ๋ ๋ฐฐ์ด
- ๋ฐฐ์ด์ length ๋ณ๊ฒฝ ๊ฐ๋ฅ
arr = []; // ๋น ๋ฐฐ์ด arr[0] = 1; arr[1] = 2; arr // [1, 2] arr.length; // 2 arr[1] = 30; // ๊ธฐ์กด ๊ฐ์ด ์์ผ๋ฉด update(๋ณ๊ฒฝ), ์์ผ๋ฉด ์ถ๊ฐ arr.length = 10; // length ๋ณ๊ฒฝ ๊ฐ๋ฅ but ์ค์ ๊ณต๊ฐ์ด ๋์ด๋๋ ๊ฑด ์๋ [1, 30, empty ร 8] arr.length = 1; // [1]
map() - ๋ณํ, flat()
arr = [1, 2, 3, 4, 5];
arr.map(e => e * 10); // [10, 20, 30, 40, 50]
arr[2] // 3 ์คํธ๋ฆผ์ ํน์ง : ์๋ณธ ๋ณ๊ฒฝ X
arr[2] = [1, 2]; // [1, 2, Array(2), 4, 5]
arr = arr.flat(); // [1, 2, 1, 2, 4, 5]
arr = arr.map(e => e * 10); // [10, 20, 10, 20, 40, 50]
arr.filter(e => e > 20) // [40, 50]
arr.find(e => e > 40) // 50 java์ findfirst์ ๊ฐ๋ค.
find(), filter() - ํน์ ์กฐ๊ฑด์ ๋ง๋ ์์ ์ฐพ๊ธฐ, ์ผ์นํ๋ ์์ ์ฐพ๊ธฐ
var ages = [10, 20, 30, 40, 50];
function checkAdult(age) {
return age >= 18;
}
// ์ฃผ์ด์ง ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ง์กฑํ๋ ๋ฐฐ์ด์ ์ฒซ ๋ฒ์งธ ์์ ๋ฐํ
ages.find(checkAdult); // 20 / ์์ฐจ ๊ฒ์
// ์ฃผ์ด์ง ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ง์กฑํ๋ ๋ชจ๋ ์์๋ก ์๋ก์ด ๋ฐฐ์ด์ ์์ฑ, ages ๋ฐฐ์ด์์ 18 ์ด์์ธ ๋ชจ๋ ์์๋ฅผ ์ฐพ๋๋ค.
ages.filter(checkAdult) // 20, 30, 40, 50
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.indexOf("Apple"); // 2
fruits.indexOf("Apple", 4); // -1 / ๋ ๋ฒ์งธ ์ธ์๋ ๊ฒ์์ ์์ํ ์ธ๋ฑ์ค ์ง์
๋ฐฐ์ด์ ๋ชจ๋ ์์ ์ถ๋ ฅ : toString(), join()
fruits.toString(); // 'Banana,Orange,Apple,Mango'
fruits.join(" - "); // 'Banana - Orange - Apple - Mango'
์์์ ์ถ๊ฐ์ ์ญ์
push(), pop() : ๋ฐฐ์ด์ ์ค๋ฅธ์ชฝ์ ์์ ์ถ๊ฐ/์ญ์
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.push("Kiwi"); // x = 5 ๋ฐฐ์ด์ ๋ง์ง๋ง์ ์์๋ฅผ ์ถ๊ฐ
var x = fruits.pop() // x = "Kiwi" ๋ฐฐ์ด์ ๋ง์ง๋ง ์์๋ฅผ ๊บผ๋ LIFO
unshift(), shift() : ๋ฐฐ์ด์ ์ผ์ชฝ์ ์์ ์ถ๊ฐ/์ญ์
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.unshift("Lemon"); // 5 / ์ฒซ ๋ฒ์งธ ์์ ์์ ์ถ๊ฐ
var x = fruits.shift(); // 'Lemon' / ์ฒซ ๋ฒ์งธ ์์๋ฅผ ์ ๊ฑฐ
splice(), delete
splice(start, [deleteCount], [item1, item2, ...])
start : ๋ฐฐ์ด์์ ๋ณ๊ฒฝ์ ์์ํ ์ธ๋ฑ์ค
deleteCount : ์์ ์ธ๋ฑ์ค์์ ์ ๊ฑฐํ ์์์ ์
item1, item2, ... : ๋ฐฐ์ด์ ์ถ๊ฐํ ์์
var fruits = ["Banana", "Orange", "Apple", "Mango"];
var x = fruits.splice(1, 1, "222"); // ๋ ๋ฒ์งธ ์์ "Orange"๋ฅผ "222"๋ก ๋์ฒด
// ['Banana', '222', 'Apple', 'Mango']
fruits.splice(1, 0, "111"); // ๋ ๋ฒ์งธ ์์์ "111"์ ์ฝ์
// ['Banana', '111', '222', 'Mango']
delete fruits[1]; // ์ญ์ ์ ์ฑ๊ณตํ๋ฉด true๋ฐํ. ์๋ ์์๋ฅผ ์ญ์ ํด๋ ํญ์ true๋ฅผ ๋ฐํ.
// ['Banana', undefined, '222', 'Mango']
์ ๋ ฌํ๊ธฐ, ๋ค์ง๊ธฐ, ์ฑ์ฐ๊ธฐ, ํฉ์น๊ธฐ
sort(), reverse(), fill() - ์ ๋ ฌํ๊ธฐ, ๋ค์ง๊ธฐ, ์ฑ์ฐ๊ธฐ
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort(); // ['Apple', 'Banana', 'Mango', 'Orange'] ์ ๋ ฌํ๊ธฐ(์ฌ์ ์ ์ ๋ ฌ)
fruits.reverse(); // ['Orange', 'Mango', 'Banana', 'Apple'] ์์ ๊ฑฐ๊พธ๋ก ๋ค์ง๊ธฐ
var arr = [40, 100, 1, 5, 25, 10];
arr.sort(); // [1, 10, 100, 25, 40, 5] ์ฌ์ ์ ์ ๋ ฌ
arr.sort(function(a, b) {
return a - b;
}
); // [1, 5, 10, 25, 40, 100] ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
arr.sort((a, b) => a - b); // ๋๋ค์ / ์ ๋ ฌ ๊ธฐ์ค์ธ Comparator๋ฅผ ์ค๋ค.
arr.sort(
function() {
Math.random() - 0.5;
}
); // [1, 10, 100, 25, 40, 5] shuffle
arr.sort(() => Math.random() - 0.5) // ๋๋ค์ / ์ ๋ ฌ๊ธฐ์ค์ด ์ผ์ ํ์ง ์์ผ๋ ๊ณ์ ๋ฐ๋ => ์์ธ๋ค.
fruits.fill("Kiwi"); // ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ Kiwi๋ก ์ฑ์ด๋ค.
๋ฐฐ์ด ํฉ์น๊ธฐ : concat()
var bigArr = arr1.concat(arr2); // ['Banana', 'Orange', 'Apple', 'Mango', 40, 5, 25, 100, 1, 10]
arr.concat(["Oct", "Nov", "Dec"]); // [40, 5, 25, 100, 1, 10, 'Oct', 'Nov', 'Dec']
var bigArr = arr.concat(arr2, arr3); // ์ธ ๊ฐ์ ๋ฐฐ์ด์ ํ๋๋ก ๋ณํฉ
arr = [22, 20, 10, 7, 5, 3, 1];
newArr = arr.concat([99, 98], ['aaa', 'bbb'])
// [22, 20, 10, 7, 5, 3, 1, 99, 98, 'aaa', 'bbb']
3.4 ๋ค์ฐจ์ ๋ฐฐ์ด
- ๋ค์ฐจ์ ๋ฐฐ์ด์ ๋ฐฐ์ด ์์ ๋ฐฐ์ด์ ๋ฃ์ด์ ๊ตฌํ
// 2์ฐจ์ ๋ฐฐ์ด(4 * 5) var arr2D = [ [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5], ]; // 2์ฐจ์ ๋ฐฐ์ด arr2D์ ๋ชจ๋ ์์๋ฅผ ์ฝ์์ ์ถ๋ ฅ for (var i = 0; i < arr2D.length; i++) { for (var j = 0; j < arr2D[i].length; j++) { console.log(arr2D[i][j]); } } // ๋ฐฐ์ด arr2์์ ๋ฐฐ์ด์ ๋ฃ์ด์ 2์ฐจ์ ๋ฐฐ์ด์ ๊ตฌ์ฑ var arr2 = []; // 5 X 5 ๋ฐฐ์ด for (var x = 0; x < 5; x++) arr2[x] = new Array(5); // ๊ธธ์ด๊ฐ 5์ธ ๋ฐฐ์ด์ ๋ฐฐ์ด arr2์ ์ ์ฅ
5. ํจ์
5.2 ํจ์์ ์ค๋ฒ๋ก๋ฉ
- arguments ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ฉด, ์๋ฐ์ ์ค๋ฒ๋ก๋ฉ์ ๊ตฌํํ ์ ์๋ค.
function subArr(arr, start, end) { if (arguments.length == 1) { return arr; } else if (arguments.length == 2) { return subArr(arr, start, arr.length); } else if (arguments.length == 3) { return arr.slice(start, end); } } var arr = [0,1,2,3,4,5,6,7]; subArr(arr); // [0, 1, 2, 3, 4, 5, 6, 7] subArr(arr, 3); // [3, 4, 5, 6, 7] subArr(arr, 3, 5); // [3, 4]
5.3 ํจ์ - ์ ํจ์ฑ ๊ฒ์ฌ์ ๋งค๊ฐ๋ณ์ ์ด๊ธฐํ
- ํธ์ถ ์ ์ธ์๊ฐ ์๋ต๋ ์ ์์ผ๋ฏ๋ก if๋ฌธ์ผ๋ก ํ์ธ ํ ๊ธฐ๋ณธ๊ฐ์ ๋ฃ์ด์ฃผ์.
undefined == null โ true
undefined === null โ false
function myFunction(x, y) { if (y === undefined) y = 0; }
- ๋ ์ฒดํฌํ ๋๋ undefined์ธ์ง ๋จผ์ ํ์ธํ์.(undefined๋ null์ด ์๋)
if (myObj != null && typeof myObj !== "undefined") // ์๋ฌ if (typeof myObj !== "undefined" && myObj != null) // OK
// ES6 ๋ฌธ๋ฒ
function add(a = 0, b = 0) {
// ES5๋ฌธ๋ฒ old ๋ฐฉ์
// var a = a || 0; a๊ฐ true๋ก ํ๋จ๋๋ ๊ฐ์ด๋ฉด a, false๋ฉด 0
// var a = a && 0
var sum = 0;
console.log("a = " + a);
console.log("b = " + b);
for (i = 0; i < arguments.length; i++)
sum += arguments[i];
return sum;
}
add(undefined, 5);
// a = 0
// b = 0
5.4 ํจ์ - ํด๋ก์
์ฝ์ด ์๋ฐ์คํฌ๋ฆฝํธ
var outer = function() { var a =1; var inner = function() { console.log(++a); }; inner(); }; outer();
var outer = function() { var a = 1; var inner = function() { return ++a; } return inner(); }; outer(); // 2 outer(); // 2 outer(); // 2
var outer = function() { var a = 1; var inner = function() { return ++a; } return inner; }; var outer2 = outer(); outer2(); // 2 outer2(); // 3 outer2(); // 4
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ๊ฐ์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์์ง ๋์์ ํฌํจํ์ง ์๋๋ค.
์์ 1, 2 โ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์์ ํฌํจ
์์ 3 โ ์ ์ธ(์ธ๋ถ ํจ์์ ์ง์ญ๋ณ์๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์ง ์์, ์ง์ญ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ๋ก ์ ๋ฌ๋ ๊ฒฝ์ฐ์๋ง ์ ์ผํ๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์ง ์๋๋ค.)
- ํด๋ก์
์ด๋ค ํจ์ A์์ ์ ์ธํ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ A์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ๊ฐ์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์์ง ๋์์ ํฌํจํ์ง ์๋๋ค.
back
- ์ ์ญ๋ณ์๋ก ์ ์ธํ๋ฉด ๋ณ์ ์ด๋ฆ์ด ์ถฉ๋๋ ์ ์๊ณ , ์ธ๋ถ์์ ์ ๊ทผ ๋ชปํ๊ฒ ๊ฐ์ ๋ณดํธํ ํ์๊ฐ ์์
var cnt = 0; // ์ ์ญ๋ณ์๋ผ์ ๋ณ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ. ๊ฐ ๋ณดํธ ํ์ function increseCnt() { cnt++; } increseCnt(); increseCnt(); increseCnt(); console.log(cnt);
- ์ง์ญ๋ณ์๋ก ์ ์ธํ๋ฉด, ๋ณ์๊ฐ ๋ณดํธ๋๊ธด ํ์ง๋ง ๋งค๋ฒ 0์ผ๋ก ์ด๊ธฐํ๋จ
function increseCnt() { var cnt = 0; // ์ง์ญ๋ณ์. ๋ฒ์(์ค์ฝํ)๋ ์ข์์ก์ผ๋ ๋งค๋ฒ 0์ผ๋ก ์ด๊ธฐํ๋จ cnt++; } increseCnt(); increseCnt(); increseCnt(); console.log(cnt); // ์๋ฌ
- ๋ณ์๋ฅผ ์ง์ญ ๋ณ์๋กํ๊ณ , ๋ด๋ถ ํจ์๋ก ๋ณ๊ฒฝ. ๋ด๋ถ ํจ์๋ผ์ ์ธ๋ถ์์ ํธ์ถ ๋ถ๊ฐ.
function closure() { var cnt = 0; function increseCnt() { // ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ธ๋ถ์์ ์ฌ์ฉํ๋ ค๋ฉด ํจ์๋ฅผ return ํด์ฃผ๋ฉด ๋๋ค. cnt++; console.log(cnt); } increseCnt(); } closure(); // increseCnt(); // ์๋ฌ
- ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํ์ฌ, ์ธ๋ถ์์ ํธ์ถํ ์ ์๋๋ก ๋ณ๊ฒฝ
function closure() { var cnt = 0; return function increseCnt() { // ์ด๋ฆ ์๋ต ๊ฐ๋ฅ cnt++; console.log(cnt); }; } var increseCnt = closure(); // ํจ์๋ฅผ ๋ฐํํ๋ค. increseCnt(); // 1 increseCnt(); // 2 increseCnt(); // 3
- ์ฝ๋ฐฑ ํจ์๊ฐ ์ธ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
for (var i = 0; i < 3; i++) { // var๋ฅผ let์ผ๋ก ๋ฐ๊พธ๋ฉด ๊ฐ๋จํ ํด๊ฒฐ๋จ /* setTimeout : ์ฃผ์ด์ง ํจ์๋ฅผ ํน์ ์๊ฐ ํ์ ์คํํ๋๋ก ์์ฝํ๋ค.(์ง์ฐ ์๊ฐ : ๋ฐ๋ฆฌ์ด๋จ์) 0 ๋ฐ๋ฆฌ์ด ํ์ 'console.log(i)'๋ฅผ 3๋ฒ ์คํํ๋ ์์ฝ์ ํ๋ค. i๋ฅผ ์ฝ์ด์ค๋ ์์ ์ด for๋ฌธ์ ๋ค ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ 3์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค. */ setTimeout(function() {console.log(i);}, 0); }
- ์ด๋ด ๋, ์ฝ๋ฐฑ ํจ์๋ฅผ ํด๋ก์ ๋ก ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
for (var i = 0; i < 3; i++) { /* ์์์์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ค๋ฉด function์ผ๋ก ํ ๋ฒ ๊ฐ์ธ์ผ ํ๋ค. ํธ์ถํ๋ ์์ ์ i๊ฐ์ด x์ ๋ณต์ฌ๋๋ค. */ (function(x) { setTimeout(function() {console.log(x);}, 0) }) (i); }
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐฐ์ด๊ณผ forEach()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ค.
[0, 1, 2].forEach(function(i) { setTimeout(function() {console.log(i);}, 0); });
- ์ ์ญ๋ณ์๋ก ์ ์ธํ๋ฉด ๋ณ์ ์ด๋ฆ์ด ์ถฉ๋๋ ์ ์๊ณ , ์ธ๋ถ์์ ์ ๊ทผ ๋ชปํ๊ฒ ๊ฐ์ ๋ณดํธํ ํ์๊ฐ ์์
- ์ ์ญ๋ณ์๋ก ์ ์ธํ๋ฉด ๋ณ์ ์ด๋ฆ์ด ์ถฉ๋๋ ์ ์๊ณ , ์ธ๋ถ์์ ์ ๊ทผ ๋ชปํ๊ฒ ๊ฐ์ ๋ณดํธํ ํ์๊ฐ ์์
var cnt = 0; // ์ ์ญ๋ณ์๋ผ์ ๋ณ์ ์ด๋ฆ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ด ์๋ค. ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅ. ๊ฐ ๋ณดํธ ํ์ var increseCnt = function() { console.log(++cnt); } increseCnt(); increseCnt(); increseCnt(); console.log(cnt);
- ์ง์ญ๋ณ์๋ก ์ ์ธํ๋ฉด, ๋ณ์๊ฐ ๋ณดํธ๋๊ธด ํ์ง๋ง ๋งค๋ฒ 0์ผ๋ก ์ด๊ธฐํ๋จ
var increseCnt = function() { var cnt = 0; // ์ง์ญ๋ณ์. ๋ฒ์(์ค์ฝํ)๋ ์ข์์ก์ผ๋ ๋งค๋ฒ 0์ผ๋ก ์ด๊ธฐํ๋จ console.log(++cnt); } increseCnt(); // 1 increseCnt(); // 1 increseCnt(); // 1 console.log(cnt); // ์๋ฌ
- ๋ณ์๋ฅผ ์ง์ญ ๋ณ์๋กํ๊ณ , ๋ด๋ถ ํจ์๋ก ๋ณ๊ฒฝ. ๋ด๋ถ ํจ์๋ผ์ ์ธ๋ถ์์ ํธ์ถ ๋ถ๊ฐ.
function closure() { var cnt = 0; var increseCnt = function() { // ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ธ๋ถ์์ ์ฌ์ฉํ๋ ค๋ฉด ํจ์๋ฅผ return ํด์ฃผ๋ฉด ๋๋ค. console.log(++cnt); } increseCnt(); } closure(); // 1 // increseCnt(); // ์๋ฌ
function closure() { var cnt = 0; var increseCnt = function() { // ๋ด๋ถ์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. ์ธ๋ถ์์ ์ฌ์ฉํ๋ ค๋ฉด ํจ์๋ฅผ return ํด์ฃผ๋ฉด ๋๋ค. console.log(++cnt); } return increseCnt(); } closure(); // 1
- ๋ด๋ถ ํจ์๋ฅผ ๋ฐํํ์ฌ, ์ธ๋ถ์์ ํธ์ถํ ์ ์๋๋ก ๋ณ๊ฒฝ
function closure() { var cnt = 0; var increseCnt = function() { console.log(++cnt); } return increseCnt; // ํจ์ return } var increseCnt = closure(); // ํจ์๋ฅผ ๋ฐํํ๋ค. increseCnt(); // 1 increseCnt(); // 2 increseCnt(); // 3
- ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ค ๊ฐ์ ์ฐธ์กฐํ๋ ๋ณ์๊ฐ ํ๋๋ผ๋ ์๋ค๋ฉด ๊ทธ ๊ฐ์ ์์ง ๋์์ ํฌํจํ์ง ์๋๋ค.
์์ 1, 2 โ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์์ ํฌํจ
์์ 3 โ ์ ์ธ(์ธ๋ถ ํจ์์ ์ง์ญ๋ณ์๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์ง ์์, ์ง์ญ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ๋ก ์ ๋ฌ๋ ๊ฒฝ์ฐ์๋ง ์ ์ผํ๊ฒ ๊ฐ๋น์ง ์ปฌ๋ ํ ๋์ง ์๋๋ค.)
- ํด๋ก์
์ด๋ค ํจ์ A์์ ์ ์ธํ ๋ณ์ a๋ฅผ ์ฐธ์กฐํ๋ ๋ด๋ถํจ์ B๋ฅผ ์ธ๋ถ๋ก ์ ๋ฌํ ๊ฒฝ์ฐ A์ ์คํ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ ์ดํ์๋ ๋ณ์ a๊ฐ ์ฌ๋ผ์ง์ง ์๋ ํ์
- ์ฝ๋ฐฑ ํจ์๊ฐ ์ธ๋ถ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
for (var i = 0; i < 3; i++) { // var๋ฅผ let์ผ๋ก ๋ฐ๊พธ๋ฉด ๊ฐ๋จํ ํด๊ฒฐ๋จ /* setTimeout : ์ฃผ์ด์ง ํจ์๋ฅผ ํน์ ์๊ฐ ํ์ ์คํํ๋๋ก ์์ฝํ๋ค.(์ง์ฐ ์๊ฐ : ๋ฐ๋ฆฌ์ด๋จ์) 0 ๋ฐ๋ฆฌ์ด ํ์ 'console.log(i)'๋ฅผ 3๋ฒ ์คํํ๋ ์์ฝ์ ํ๋ค. i๋ฅผ ์ฝ์ด์ค๋ ์์ ์ด for๋ฌธ์ ๋ค ๋ ์์ ์ด๊ธฐ ๋๋ฌธ์ 3์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค. */ setTimeout(function() {console.log(i);}, 0); }
- ์ด๋ด ๋, ์ฝ๋ฐฑ ํจ์๋ฅผ ํด๋ก์ ๋ก ๋ณ๊ฒฝํ๋ฉด ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ป๋๋ค.
for (var i = 0; i < 3; i++) { /* ์์์์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๋ ค๋ฉด function์ผ๋ก ํ ๋ฒ ๊ฐ์ธ์ผ ํ๋ค. ํธ์ถํ๋ ์์ ์ i๊ฐ์ด x์ ๋ณต์ฌ๋๋ค. */ (function(x) { setTimeout(function() {console.log(x);}, 0) }) (i); }
- ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐฐ์ด๊ณผ forEach()๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋ค.
[0, 1, 2].forEach(function(i) { setTimeout(function() {console.log(i);}, 0); });
ํด๋ก์ ๋ ์๋ฐ์์์ ๊ฒํฐ ์ธํฐ์ ๋์ผ ์ผ์ข ์ ์ฝ๋ฉ ํจํด? ํจ์ ์์ ๋ฃ์ผ๋ฉด ๊ฐ์ด ์๋ชป๋ ์ผ์ด ์์
4/19(์)
6. ๊ฐ์ฒด
6.1 ๊ฐ์ฒด์ ์์ฑ๋ฐฉ๋ฒ
- ๋น ๊ฐ์ฒด๋ฅผ ์์ฑํ ํ, ๋ฉค๋ฒ(์์ฑ, ํจ์)๋ฅผ ์ถ๊ฐ
// var person = new Object();๊ณผ ๋์ผ -> ๊ตณ์ด? var person = {}; ์ผ๋ก ์์ฑํ๊ธฐ var person = {}; // ๋น ๊ฐ์ฒด ์์ฑ // ๊ฐ์ฒด์ ์์ฑ ์ถ๊ฐ person.firstName = "John"; person.lastName = "Doe"; person.age = 50; person.eyeColor = "blue";
- ๊ฐ์ฒด์ ์์ฑ๊ณผ ๋์์ ๋ฉค๋ฒ๋ฅผ ์ถ๊ฐ
let myObject = { firstName : "John", lastName : "Doe", fullName : function() { // key : value ์์ผ๋ก ์ ์ฅํ๋ค. function๋ ์ ์ฅ ๊ฐ๋ฅ return this.firstName + " " + this.lastName; } };
6.2 ์์ฑ์๋ก ๊ฐ์ฒด ์์ฑํ๊ธฐ
- ์์ฑ์๋ฅผ ์ ์ํ๋ฉด ๊ฐ์ฒด๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ ์ ์๋ค.
function Person(name, age) { // ์์ฑ์ Person ์ ์ธ. ์์ฑ์์ ์ฒซ ๊ธ์๋ ๋๋ฌธ์๋ก this.name = name; // ์ฌ๊ธฐ์ this๋ (์์ผ๋ก ์์ฑ๋ ) ๊ฐ์ฒด ์์ ์ ์๋ฏธ this.age = age; } var obj = new Person("david", 10); var obj2 = new Person("wendy", 20); obj.toString = function() { return this.name + this.age; // this๋ฅผ ๊ผญ ๋ถ์ฌ์ผํจ } obj.toString(); // 'david10' obj2.toString(); // '[object Object]' // JS๋ ๊ฐ์ฒด ๊ณต์ X ๋ค ๊ฐ๋ณ์ ๊ทธ๋์ ํ๋กํ ํ์ ์
6.3 ๊ฐ์ฒด์ ์์ฑ(๋ฉค๋ฒ) ์ญ์ ํ๊ธฐ - delete
- delete ์ฐ์ฐ์๋ก ๊ฐ์ฒด์ ์์ฑ์ ์ญ์ ํ ์ ์๋ค.(๋ฌผ๋ ค๋ฐ์ ์์ฑ์ ์ญ์ ๋ถ๊ฐ)
var obj = {}; // ๋น ๊ฐ์ฒด // ์์ฑ์ ์ถ๊ฐ obj.name = 'david'; obj.age = 10; // toString()์ถ๊ฐ - ์๋ฐ์ ์ค๋ฒ๋ผ์ด๋ฉ obj.toString = function() { return this.name + ", " + this.age; } obj.toString(); // 'david, 10' delete obj.name; // ๊ฐ์ฒด obj์์ ์์ฑ name์ ์ญ์ obj; // {age: 10, toString: ฦ}
6.4 instanceof์ typeof
- instanceof๋ฅผ ํตํด ๊ฐ์ฒด๊ฐ ์ด๋ค ์์ฑ์์ ์ํด ์์ฑ๋์๋์ง ํ์ธ ๊ฐ๋ฅ
function๋ object์ด๋ค.
var obj = new Object(); var p = new Person("david", 10); var s = new String(); // var str = 'abc'๋ก ์ฐ๊ธฐ var f = new Function(); // var f = function() {}; ์ ๋์ผ typeof obj // 'object' typeof p // 'object' typeof s // 'object' typeof f // 'function' obj instanceof Object // true p instanceof Object // true s instanceof Object // true f instanceof Object // true obj instanceof String // false p instanceof Person // true s instanceof String // true f instanceof Function // true ---- typeof new Object() // 'object' typeof new Person("david", 10) // 'object' typeof new String() // 'object' typeof new Function() // 'function'
str = 'abc'; strObj = new String('aaa'); typeof str; // 'string' typeof strObj; // 'object' str instanceof String // false ๊ฐ์ฒด๊ฐ ์๋๊ธฐ ๋๋ฌธ์ strObj instanceof String // true
6.5 ๊ฐ์ ํ์ ์ ๊ฐ์ฒด๋ผ๋ ํจ์๋ฅผ ๊ณต์ ์ํจ.
- ๊ฐ์ ์์ฑ์๋ก ์์ฑํ ๊ฐ์ฒด๋ผ๋ ์๋ก ๋ค๋ฅธ ํจ์๋ฅผ ๊ฐ์ง ์ ์๋ค.
์ด๋ ๊ฒ ๊ณต์ ๊ฐ์ ๋๋ ๋ฌธ์ ๋ฅผ prototype์ด๋ผ๋ ๊ณต์ ๊ฐ์ฒด๋ฅผ ํตํด์ ํด๊ฒฐ.
obj.getName = function() { return this.name; } obj.getName(); // 'david' obj2.getName(); // ์๋ฌ. obj2์๋ getName()์ด ์์ for (var prop in obj) console.log(obj[prop]); // ์์ฑ์ด 3๊ฐ Personย {name: 'david', age: 10, getName: ฦ} for (var prop in obj2) console.log(obj[prop]); // ์์ฑ์ด 2๊ฐ Personย {name: 'wendy', age: 20}
this
- ๊ฐ์ฒด ์์ โ ๋๋ถ๋ถ ์ด๊ฑฐ์
- window(๋ธ๋ผ์ฐ์ )
function Person(name, age) {
this.name = name;
this.age = age;
}
let p1 = Person('ccc', 20);
// new๋ฅผ ์ฐ๋ฉด ์๋ก์ด ๊ฐ์ฒด๊ฐ ๋ง๋ค์ด์ง๊ณ ์ฃผ์๊ฐ ๋ฐํ๋๋๋ฐ new๋ฅผ ์ ์ฐ๋ฉด ๊ฐ์ฒด๊ฐ ์ ๋ง๋ค์ด์ง
let p2 = Person('ccc', 20);
// ๊ฐ์ฒด๊ฐ ์์ผ๋ฉด window์ด๊ธฐ ๋๋ฌธ์ window์ name๊ณผ age๊ฐ ์ถ๊ฐ๋จ
window.name; // '๋ฐฉ์ฑ๋ฏผ'
window.age; // 22
6.6 prototype, __proto__, constructor
- ๊ฐ์ฒด๋ ์์ ์ ์์ฑํ ์์ฑ์์ prototype์ ๋ํ ์ฐธ์กฐ์ธ __proto__์ constructor ์์ฑ์ ์๋์ผ๋ก ๋ฌผ๋ ค๋ฐ๋๋ค.
function Person(name, age) { this.name = name; this.age = age; } Object.prototype === obj.__proto__; // true var p = new Person("david", 10); Person.prototype === p.__proto__ // true var s = new String(); String.prototype === s.__proto__ // true var f = new Function(); Function.prototype === f.__proto__ // true obj.constructor == Object; // true p.constructor == Person; // true
6.7 ์์ฑ์์ prototype์ ์ด์ฉํ ๊ณต์ ํจ์
prototype = ๊ณต์ ๊ฐ์ฒด
- ์์ฑ์์ prototype์ ํจ์๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ฒด๊ฐ ํจ์ ๊ณต์ ๊ฐ๋ฅ
์๋ฐ์คํฌ๋ฆฝํธ์์์ ๊ฐ์ฒด๋ ๋์ผํ ์์ฑ์๋ฅผ ์ฌ์ฉํด์ ์์ฑํด๋ ๋ชจ๋ ๊ฑธ ๊ฐ๋ณ์ ์ผ๋ก ๊ฐ์ง๊ณ ์๋ค. ๊ฐ์ฒด๋ง๋ค ๋ฉ์๋๋ฅผ ์ผ์ผํ ์ง์ด๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ์ฒด๊ฐ ํ์ํด ํ๋กํ ํ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. static ์ฒ๋ผ ๊ณต์ ํ๊ฒ ํ๊ณ ์ถ์ ๊ฑธ prototype์ ๋ฃ์ผ๋ฉด ๋๋ค.
- ๋ชจ๋ ๊ฐ์ฒด๋ ๋ฉค๋ฒ์ __proto__๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ชจ๋ ํจ์๋ ๋ฉค๋ฒ์ prototype์ ๊ฐ์ง๊ณ ์๋ค.
๋ฉค๋ฒ๋ฅผ ์ฐพ๋๋ฐ ๊ฐ์ฒด์ ์์ผ๋ฉด ๊ณต์ ๊ฐ์ฒด๋ฅผ ๋ค์ง๋ค. ๊ณต์ ๊ฐ์ฒด์๋ ์์ผ๋ฉด Object๋ฅผ ๋ค์ง
Person ๊ฐ์ฒด โ Person.prototype(๊ณต์ ๊ฐ์ฒด) โ Object
function Person(name, age) { this.name = name; this.age = age; } var obj = new Person("david", 10); var obj2 = new Person("wendy", 20); // ์์ฑ์์ prototype์ ํจ์ getName()์ ์ถ๊ฐ. ์ด์ ๋ p1 p2๊ฐ ๋ค ๊ณต์ ํ๋ค. Person.prototype.getName = function() { return this.name; } // ์์ ๋์ผ obj.__proto__.getName = function() { return this.name; } obj.getName(); // 'david' obj2.getName(); // 'wendy'
p.constructor; // p์ ์์ฑ์. constructor ํธ์ถ ์ ์์ฑ์๊ฐ ๋์จ๋ค.
ฦ Person(name, age) {
this.name = name;
this.age = age;
}
p.__proto__ == Person.prototype; // true
6.8 ๊ฐ์ฒด๋ฅผ ์๋ฏธํ๋ this
- this๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ. ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง.
- ์ ์ญ ๋ฒ์์์ this๋ window(๋ธ๋ผ์ฐ์ )๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
alert("abc"); this.alert("abc"); // this๋ window๋ฅผ ์๋ฏธ window.alert("abc"); console.log(this); // window ๊ฐ์ฒด๋ฅผ ์๋ฏธ
// ์๋ก์ด ๊ฐ์ฒด ์์ฑ var p = new Person("Tom", 33); // Personย {name: 'Tom', age: 33} // ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์์ var p2 = Person("Tim", 22); // undefined p2; // undefined this.name; // 'Tim' this.age; // 2
var p3 = {}; var p4 = new Object(); // call๊ณผ apply๋ ๋ฌธ๋ฒ๋ง ๋ค๋ฅผ๋ฟ ๋์ผํ๋ค. Person.call(p3, "Sebin", 11); // {name: 'Sebin', age: 11} Person.apply(p3, ["Yebin", 9]); // {name: 'Yebin', age: 9}ใ
- evnet ํจ์ ๋ด์์์ this๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ์์(element)๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
๋จ, ์ด๋ฒคํธ ํจ์๋ฅผ ๋๋ค์์ผ๋ก ์์ฑํ ์ this๋ ์ ์ญ ๊ฐ์ฒด window๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
h1.onclick = () => alert(this); // this = window h1.onclick = function() { alert(this); // h1 }
6.9 call(), apply()๋ก this์ ๋์ ๋ณ๊ฒฝ
- call(), apply(), bind()๋ฅผ ์ฌ์ฉํ๋ฉด this๊ฐ ๊ฐ๋ฆฌํค๋ ๋์์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ด๋ฏธ ์์ฑ๋์ด์๋ ๊ฐ์ฒด์๊ฒ ์ ์ฉํ ๋ call, apply๋ฅผ ์ฌ์ฉํ๋ค.
function Person(name, age) { this.name = name; this.age = age; console.log("[" + this.name + ", " + this.age + "]"); } var p = new Person("Tom", 33); // ์๋ก์ด ๊ฐ์ฒด ์์ฑ var p2 = Person("Tim", 22); // ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ง ์์ Person.call(p3, "Sebin", 11); // p3 = new Person("Sebin", 11);์ ๋์ผํ ์๋ฏธ Person.apply(p4, ["๋ฐฉ์ฑ๋ฏผ", 22]]);
6.10 ์ค์ฒฉ๋ ํจ์์์์ this
- ํจ์๊ฐ ์ค์ฒฉ๋๋ฉด this์ ์๋ฏธ๊ฐ ๋ฌ๋ผ์ง๋ค.
๊ฐ์ฒด์ ํ๋กํผํฐ ํจ์ ๋ด์์์ this๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค. but ๋ ๋ฒ ์ด์ ์ค์ฒฉ์ผ๋ก ๋์ด๊ฐ๋ฉด ์ ์ญ ๊ฐ์ฒด(window)๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
var myObj = { func1 : function() { console.log(this); // myObj ๊ฐ์ฒด์ ํ๋กํผํฐ ํจ์ ๋ด์์์ this๋ ๊ทธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด var func2 = function() { console.log(this); // window var func3 = function() { console.log(this); // window } (); } (); } } myObj.func1();
<ํด๊ฒฐ๋ฐฉ๋ฒ>
- this = this โ ๋ณ๋์ ๋ณ์์ ์ ์ฅํ๋ค.
- bind()
- ๋๋ค์
- ๋ณ๋์ ๋ณ์์ this์ ๊ฐ์ ์ ์ฅํด ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
var myObj2 = { myFunc : function() { // myObj2์ ๋ฉค๋ฒ key : myFunc value : function var that = this; // this๊ฐ ๋ฉ์ฉกํ ๋ ๋ณ์์ ์ ์ฅํ๋ค. var myFunc2 = function() { console.log("that : " + that); // that์ myObj console.log("this : " + this); // this๋ window } (); } }
6.11 HTML๊ณผ jQuery์์์ this
- this๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ๊ฐ์ฒด๋ฅผ ์๋ฏธ. ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง
<body> <!-- this๋ <h1>์ ๊ฐ๋ฆฌํจ๋ค. --> <h1 onclick="this.innerHTML = 'Ooops!'">Click on this text!</h1> <!-- this๋ <span>์ ๊ฐ๋ฆฌํด --> <span onmouseover="this.style.color='red'" onmouseout = "this.style.color='blue'"> Mouse over me! </span> // this๋ <p>๋ฅผ ๊ฐ๋ฆฌํด $("p").click(function(){ $(this).slideUp(); });
6.12 ๊ฐ์ฒด์ ์์ฑ์ ์ ๊ทผ ์ ํํ๊ธฐ
- ์์ฑ์์ ๋ณ์๋ฅผ ์ง์ญ ๋ณ์๋ก ์ ์ธํ์ฌ ์ ๊ทผ์ ์ ํ, ๋์ getter๋ฅผ ์ ๊ณต
function Person(name, age) { this.name = name; // ์ฌ๊ธฐ์ this๋ p1 this.age = age; } -------------------------------- let p1 = new Person("๋ฐฉ์ฑ๋ฏผ", 44); p1.name; // '๋ฐฉ์ฑ๋ฏผ'
- js๋ ์ ๊ทผ์ ์ด์๊ฐ ์๊ธฐ ๋๋ฌธ์ iv โ lv๋ก ๋ณ๊ฒฝํด์ ๋ณดํธํ๋ค.
function Person(name, age) { // this.name = name; // this.age = age; var name = name; // ์ง์ญ๋ณ์๋ก ์ ์ธ var age = age; // ์ง์ญ๋ณ์๋ก ์ ์ธ this.getName = function() { return name; } this.getAge = function() { return age; } } -------------------------------- var p2 = new Person("๋ฐฉ์ฑ๋ฏผ", 22); p2.getName(); // '๋ฐฉ์ฑ๋ฏผ' p2.getAge(); // 22 p.name; // ์๋ฌ. ์ง์ญ๋ณ์์ ์ ๊ทผํ ์ ์์ p.age; // ์๋ฌ. ์ง์ญ๋ณ์์ ์ ๊ทผํ ์ ์์
6.13 ๋ ๊ฐ์ฒด๊ฐ์ ์์๊ด๊ณ ๋งบ์ด์ฃผ๊ธฐ
- Person ๊ฐ์ฒด์ Manager ๊ฐ์ฒด๋ฅผ ์กฐ์ ์์ ๊ด๊ณ๋ก ๋งบ์ด์ฃผ๋ ๋ฐฉ๋ฒ
function Person(name, age) { this.name = name; this.age = age; } function Manager(dept, name, age) { Person.call(this, name, age); // ์กฐ์์ ์์ฑ์๋ฅผ ํธ์ถ this.dept = dept; } var m = new Manager('Sales', 'adsf', 12); m.age; // 12 m instanceof Person // false // Manager.prototype = Person.prototype; // ์๋ชป๋ ๋ฐฉ๋ฒ Manager.prototype.__proto__ = Person.prototype; // ๋ถ๋ชจ ์์ ์์ ๊ด๊ณ ๋งบ์ด์ฃผ๊ธฐ

7.1 DOM
= (Document Object Model)
- ๋ธ๋ผ์ฐ์ ๋ HTML ๋ฌธ์๋ฅผ ์ฝ์ด์ DOM์ ๊ตฌ์ฑํ๋ค.
<!DOCTYPE html> <html lang="en"> <head> <title>My title</title> </head> <body> <a href="">My link</a> <h1>My header</h1> </body>
๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ์ด์ ํ๋ํ๋ ๊ฐ์ฒด๋ฅผ ์์ฑํด ๊ณ์ธต๊ตฌ์กฐ๋ก ๋ง๋ ๋ค. โ ์ด๊ฒ ๋ํธ๋ฆฌ
DOM = html์ฝ์ด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ฐ์ฒด๋ค๊ฐ์ ๊ด๊ณ๋ฅผ ๊ทธ๋ฆฐ ๊ฒ
- CSSOM
๋์์ธ(css) ๊ด๋ จ๋ ํธ๋ฆฌ
Render Tree = DOM + CSSOM
(data๋ผ๋) + (๋์์ธ)
๋ธ๋ผ์ฐ์ ๊ฐ Rener Tree๋ฅผ ๋ณด๊ณ ์์ญ์ ์ก๋๋ค.
- ๋ ์ด์์
- ํ์ธํธ
- ์ขํ, ์ฌ์ด์ฆ ๊ณ์ฐ
DOM์์ ์์(element) ์ฐพ๊ธฐ
document.getElementById(id) // id๋ก ์ฐพ๊ธฐ
document.getElementByTagName(name) // Tag๋ก ์ฐพ๊ธฐ
document.getElementByClassName(name) // class๋ก ์ฐพ๊ธฐ
document.getElementsByName(name) // name์ผ๋ก ์ฐพ๊ธฐ
document.querySelectorAll("์
๋ ํฐ") // CSS selector๋ก ์ฐพ๊ธฐ
[์ฐธ๊ณ ] document.querySelector("์
๋ ํฐ") // ํ ๊ฐ๋ง ๋ฐํ
DOM์์ ์์(element) ๋ณ๊ฒฝํ๊ธฐ
element.innerHTML = "์๋ก์ด ๋ด์ฉ";
element.style.CSS์์ฑ = ๊ฐ; // CSS ์์ฑ ๋ณ๊ฒฝ
element.setAttribute(์์ฑ, ๊ฐ); // element.์์ฑ = ๊ฐ;
var attr = element.getAttribute("์์ฑ"); // ์์ฑ ์ฝ์ด์ค๊ธฐ
<h1 id="click" onclick="this.innerHTML = 'Ooops!'">Click on this text!</h1>
const h1 = document.getElementById('click');
h1.innerHTML = '๋ฐฉ์ฑ๋ฏผ';
h1.style.color = 'blue';
h1.setAttribute(name, 'nametest');
h1.getAttribute('id'); // 'click'
์ค์ต1 - window.onload
: html ๋ฆฌ์์ค๊ฐ ๋ชจ๋ ๋ก๋๋์์ ๋ ๋ฐ์๋๋ ์ด๋ฒคํธ
window.onload = function() {
var h1Tag = document.getElementById('header0'); // id๊ฐ header0์ธ ์์๋ฅผ ๊ฐ์ ธ์จ๋ค.
var h1Tags = document.querySelectorAll('h1');
h1Tag.innerHTML += '- first';
for (i = 0; i < h1Tags.length; i++) {
h1Tags[i].innerHTML += '-' + i;
h1Tags[i].style.border = '2px solid red'; // ํ
๋๋ฆฌ 2px, ๋นจ๊ฐ์์ผ๋ก
h1Tags[i].style.color = 'orange'; // ๊ธ์์์ orange
h1Tags[i].style.backgroundColor = 'yellow';
}
}
์ค์ต2 - createElement, createTextNode
: ๋ ธ๋ ์ง์ ์์ฑ
- ์ง์ ์์ ์์ฑ
- text๋ก ์์ฑ(๋ฌธ์์ด)
โ 2๋ฒ์ผ๋ก ์์ฑํ๋ ๊ฑฐ์ ์ต์ํด์ง๋ ๊ฒ ์ข์
var h1 = document.createElement('h1'); // ๋
ธ๋๋ฅผ ์ง์ ์์ฑ h1 ํ๊ทธ ์์ฑ
var txtNode = document.createTextNode('Hello');
h1.appendChild(txtNode); // h1ํ๊ทธ์ text node๋ฅผ ์ถ๊ฐ
document.body.appendChild(h1); // h1ํ๊ทธ๋ฅผ body ํ๊ทธ์ ์ถ๊ฐ
// ์์ 4์ค์ด ์๋ 1์ค๊ณผ ๋์ผ
// document.body.innerHTML = '<h1>Hello</h1>';
์ค์ต3 : ์ฌ์ฉ์ ์ ์ ์์ฑ
์ฌ์ฉ์ ์ ์ ์์ฑ์ setAttribute(), getAttribute()๋ก ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ํด์ผ ํ๋ค.
window.onload = function() {
var img = document.createElement('img');
img.setAttribute('src', '../jokebear.png'); // img.src = "cat.jpg"
img.setAttribute('width', 300); // img.width = 300;
img.setAttribute('height', 200); // img.height = 200;
img.setAttribute('id', 'img');
// ์ฌ์ฉ์ ์ ์ ์์ฑ์ setAttribute(), getAttribute()๋ก ์ฝ๊ณ ์ฐ๊ธฐ๋ฅผ ํด์ผ ํ๋ค.
img.setAttribute('data-prop', 100); // img.data-prop = 100;๋ ๋ถ๊ฐ
document.body.appendChild(img); // ๋
ธ๋๋ฅผ DOM์ ์ฐ๊ฒฐ
}
DOM์์ ์์(element) ์ํํ๊ธฐ(navigation)
firstChild, fistElementChild : ์ฒซ ๋ฒ์งธ ์์ ๋
ธ๋์ ์ ๊ทผ
lastChild, lastElementChild : ๋ง์ง๋ง ์์ ๋
ธ๋์ ์ ๊ทผ
nextSibling, nextElementSibling : ๋ด ๋ค์ ํ์ ๋
ธ๋์ ์ ๊ทผ ๊ฐ๋ฅ
previousSibling, previousElementSibling : ๋ด ์ด์ ํ์ ๋
ธ๋์ ์ ๊ทผ ๊ฐ๋ฅ
parentNode : ์์์ ๋ถ๋ชจ ๋
ธ๋
7.2 ์ด๋ฒคํธ(event)
- HTML์ ์์์ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋ ๊ฒ์ด โHTML์ด๋ฒคํธ(event)โ์ด๋ค.
<์์ฃผ ์ฐ์ด๋ ์ด๋ฒคํธ๋ค>
์ด๋ฒคํธ(์์ฑ) | ์ค๋ช |
---|---|
onload | ๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ด์ง์ ๋ก๋ฉ์ ๋ง์ณค์ ๋ |
onclick | ์ฌ์ฉ์๊ฐ HTML ์์๋ฅผ ํด๋ฆญํ์ ๋ |
onmouseover | ๋ง์ฐ์ค๊ฐ HTML ์์์ ์์ ์ฌ๋ผ๊ฐ์ ๋ |
onmouseout | ๋ง์ฐ์ค๊ฐ HTML ์์์ ์์์ ๋ฐ์ผ๋ก ๋ฒ์ด๋ฌ์ ๋ |
onkeydown | ์ฌ์ฉ์๊ฐ ํค๋ณด๋๋ฅผ ๋๋ ์ ๋ |
onchange | HTML ์์๊ฐ ๋ณ๊ฒฝ๋์์ ๋ |
์ด๋ฒคํธ ๋ชจ๋ธ
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ ์, ์ํ๋ ์์ ์ ์์ฑํ๋ ๊ฒ์ โ์ด๋ฒคํธ ์ฒ๋ฆฌโ๋ผ๊ณ ํ๋ค.
- ๋ฌธ์ ๊ฐ์ฒด(document object)์ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ(์ด๋ฒคํธ ๋ชจ๋ธ)
<DOM Level 0> - old
- ๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ชจ๋ธ(๊ณ ์ ์ด๋ฒคํธ ๋ชจ๋ธ)
- ์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ
h1.onclick = function() {} // 1๊ฐ๋ง ๋์ ๊ฐ๋ฅ
<DOM Level 2> - new
- ํ์ค ์ด๋ฒคํธ ๋ชจ๋ธ
- IE ์ด๋ฒคํธ ๋ชจ๋ธ
addEventListener() // ์ฌ๋ฌ๊ฐ ๋ฑ๋ก ๊ฐ๋ฅ
๊ธฐ๋ณธ ์ด๋ฒคํธ ๋ชจ๋ธ
- ๋ฌธ์ ๊ฐ์ฒด(document object)์ ์ด๋ฒคํธ ์์ฑ์ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์๋ฅผ ์ฐ๊ฒฐ
- ์ฐ๊ฒฐ์ ์ ๊ฑฐํ ๋๋ ์ด๋ฒคํธ ์์ฑ์ null์ ์ ์ฅ
window.onload = function() { var header = document.getElementById('d'); // header.onclick = click; header.onclick = function() { alert("๋ฐฉ์ฑ๋ฏผ2"); } // header.onclick = null; // ์ฐ๊ฒฐ๋ ์ด๋ฒคํธ ์ฒ๋ฆฌ ํจ์๋ฅผ ์ ๊ฑฐ } function click() { alert("๋ฐฉ์ฑ๋ฏผ"); console.log("๋ฐฉ์ฑ๋ฏผ"); }ใด
์์ธ๊ฐ ๋ฐ์๋๋ฉด catch ๋ธ๋ญ์ผ๋ก ๋ค์ด์ค๊ณ ์์ธ์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ฒ๋ผ
ํด๋ฆญ ์ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ณ e์๋ ์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค. ์ด ์ ๋ณด๋ค์ ์ด์ฉํด์ ์ฝ๋ฉ ๊ฐ๋ฅํ๋ค.
<h1 id="header">Click me!!!</h1>
$0.onclick; // null
$0.onclick = function(e) { // e์๋ ์ด๋ฒคํธ์ ๋ํ ์ ๋ณด๊ฐ ๋ค์ด์๋ค.
console.log(e);
console.log(e.srcElement); // ์ด๋ฒคํธ ์์ค(์ ์ผ ์ค์) ์ด๋์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์๋ค. target์ด๋ ๋น์ทํจ
console.log(e.target);
console.log(e.pointerType); // mouse
}
$0.onclick = function(e) {
e.srcElement.innerHTML = 'Chaemin'; // h1์ด Chaemin์ผ๋ก ๋ฐ๋๋ค.
}
dir($0); // $0 = h1 ํ๊ทธ
on์ผ๋ก ์์ํ๋ ๊ฒ ๋ค ์ด๋ฒคํธ ์์ฑ์. ๋ด๋ฆฌ๋ค๋ณด๋ฉด onclick์ด null์ด ์๋ ๊ฒ์ ์ ์ ์๋ค.
์ด๋ฒคํธ์ ์ด๊ธฐ๊ฐ์ null์ด๋ค. ์ฐ๊ฒฐ๋ ํจ์๊ฐ ์์ด์ ์๋ฌด๋ฐ ๋์์ด ์๋ ๊ฒ์ด์ง ์ด๋ฒคํธ๋ ํญ์ ์ผ์ด๋๊ณ ์๋ค. ์ฌ๊ธฐ์ ์ฐ๊ฒฐ๋ ํจ์๋ฅผ ์ด๋ฒคํธ ํธ๋ค๋ฌ(์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์ฒ๋ฆฌํ๋ ์ )๋ผ๊ณ ํ๋ค.
์ธ๋ผ์ธ ์ด๋ฒคํธ ๋ชจ๋ธ
- ํ๊ทธ์ ์ง์ ์ด๋ฒคํธ ์์ฑ์ ์ง์ (this๋ ํ๊ทธ ์์ ์ ์๋ฏธ)
์ด ๋ฐฉ์์ ์ ์ฌ์ฉํ์ง ์์ (ํฌ์ธํฐ, mouseover ์ ์ธํ๊ณ ๋..)
<h1 id="header" onclick="alert(this);">Click me!!!</h1> // function() { alert(this); } function() {} ์๋ต๋ ๊ฒ
Uploaded by N2T