[JavaScript] 핡심 κ°œλ…

λ””λ”©Β·2022λ…„ 11μ›” 7일
0

Section

λͺ©λ‘ 보기
14/18
post-thumbnail

πŸ•– DAY +13 / 2022. 11. 07

SEB FE / Section1 / Unit9 / JavaScript 핡심 κ°œλ…κ³Ό μ£Όμš” 문법



πŸ“Œ Today I Learned

  • μ›μ‹œ μžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•
  • μŠ€μ½”ν”„
  • ν΄λ‘œμ €

πŸ’¬ μ›μ‹œ μžλ£Œν˜•κ³Ό μ°Έμ‘° μžλ£Œν˜•

πŸ“‚ μ›μ‹œ μžλ£Œν˜•(ptimitive type data)

stackμ΄λΌλŠ” 사물함 μ•ˆμ— 값을 ν• λ‹Ήν•˜κ³ , μ‚¬μš© μ‹œμ—” μ‚¬λ¬Όν•¨μ—μ„œ μ΄λ¦„ν‘œλ₯Ό μ°Ύμ•„ 값을 λ°˜ν™˜ν•œλ‹€
number string boolean null undefined

let a;
a = 1;
a; // 1

let b = 2;
let c = 3;

각 λ³€μˆ˜ κ°„μ˜ μ›μ‹œ νƒ€μž… 데이터λ₯Ό 볡사항 경우 데이터값이 λ³΅μ‚¬λ˜κΈ° λ•Œλ¬Έμ— 기쑴의 데이터에 영ν–₯이 가지 μ•ŠλŠ”λ‹€.

 const num1 = 123;
 const num2 = 123456789;

μ΄λ ‡κ²Œ λ³€μˆ˜μ—λŠ” λ°μ΄ν„°μ˜ ν¬κΈ°μ™€λŠ” 관계없이 ν•˜λ‚˜μ˜ λ°μ΄ν„°λ§Œ 담을 수 μžˆλ‹€.
μ›μ‹œ μžλ£Œν˜•μ€ κ°’ μžμ²΄μ— λŒ€ν•œ 변경이 λΆˆκ°€λŠ₯(immutable)ν•˜μ§€λ§Œ, λ³€μˆ˜μ— λ‹€λ₯Έ 데이터λ₯Ό ν• λ‹Ήν•  μˆ˜λŠ” μžˆλ‹€.

"hello world!"
"hello codestates!"
// "hello world!" 와 "hello codestates!"λŠ” λͺ¨λ‘ λ³€κ²½ν•  수 μ—†λŠ” κ³ μ •λœ 값이닀.

let word = "hello world!"
word = "hello codestates!"
// ν•˜μ§€λ§Œ, wordλΌλŠ” λ³€μˆ˜μ— μž¬ν• λ‹Ήμ„ ν•˜μ—¬ λ³€μˆ˜μ— λ‹΄κΈ΄ λ‚΄μš©μ„ λ³€κ²½ν•˜λŠ” 것은 κ°€λŠ₯ν•˜λ‹€.

const num1 = 123;
num1 = 123456789; // μ—λŸ¬ λ°œμƒ
// const ν‚€μ›Œλ“œλ‘œ μ„ μ–Έν•˜λ©΄, μž¬ν• λ‹Ήμ€ λΆˆκ°€ν•˜λ‹€.

πŸ“‚ μ°Έμ‘° μžλ£Œν˜•(reference type data)

heapμ΄λΌλŠ” 빈 곡간을 λ§Œλ“€κ³  사물함에 μ΄λ¦„ν‘œλ₯Ό 단닀. κ°’ λŒ€μ‹  μ£Όμ†Œλ₯Ό 달고, μ£Όμ†ŒλŠ” heap와 μ—°κ²°λ˜μ–΄ μžˆλ‹€. 값을 찾을 땐 사물함 μ•ˆμ˜ μ£Όμ†Œλ₯Ό 보고 heapμ—μ„œ μ°Ύμ•„ λ°˜ν™˜ν•œλ‹€.
array function object

let a = [4, 5, 6];
let b = ["a", 1, 2];
let c = [true, false];
b.pop();
a[0] = 3;
c.pusg("a");

λ°°μ—΄λ“€μ˜ μ›μ†Œλ₯Ό λΉΌλ‚΄κ±°λ‚˜ μˆ˜μ •μ„ 해도 값을 찾을 λ•Œ λ³΅μž‘ν•΄μ§€μ§€ μ•ŠλŠ”λ‹€.

μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν•˜κΈ° λ•Œλ¬Έμ— λ³΅μ‚¬ν•œ λ°μ΄ν„°μ—μ„œ μ›μ†Œλ₯Ό λ³€κ²½ν•˜κ²Œ λœλ‹€λ©΄ μ£Όμ†Œ μ•ˆμ˜ 데이터가 λ³€κ²½λ˜κΈ° λ•Œλ¬Έμ— 기쑴의 데이터에도 영ν–₯이 κ°€κ²Œ λœλ‹€.

  • μ›μ‹œ μžλ£Œν˜•μ΄ 할당될 λ•Œμ—λŠ” λ³€μˆ˜μ— κ°’(value) μžμ²΄κ°€ λ‹΄κΈ°κ³ , μ°Έμ‘° μžλ£Œν˜•μ΄ 할당될 λ•ŒλŠ” λ³΄κ΄€ν•¨μ˜ μ£Όμ†Œ(reference)κ°€ λ‹΄κΉλ‹ˆλ‹€.
  • κ·Έλž˜μ„œ μ°Έμ‘° μžλ£Œν˜•μ€ 기쑴에 κ³ μ •λœ 크기의 보관함이 μ•„λ‹ˆλΌ, λ™μ μœΌλ‘œ 크기가 λ³€ν•˜λŠ” νŠΉλ³„ν•œ 보관함을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.



πŸ’¬ μŠ€μ½”ν”„

μŠ€μ½”ν”„λŠ” "λ³€μˆ˜ μ ‘κ·Ό κ·œμΉ™μ— λ”°λ₯Έ 유효 λ²”μœ„"이닀.
λ³€μˆ˜κ°€ μ ‘κ·Όν•  수 μžˆλŠ” λ²”μœ„κ°€ μ‘΄μž¬ν•œλ‹€.
μ€‘κ΄„ν˜Έ(블둝) μ•ˆμͺ½μ— λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλŠ”κ°€, λ°”κΉ₯μͺ½μ— λ³€μˆ˜κ°€ μ„ μ–Έλ˜μ—ˆλŠ”κ°€κ°€ μ€‘μš”ν•˜λ‹€.
이 λ²”μœ„λ₯Ό μš°λ¦¬λŠ” μŠ€μ½”ν”„λΌκ³  λΆ€λ₯Έλ‹€.

λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” μ•ˆμͺ½ μŠ€μ½”ν”„μ—μ„œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.
λ°˜λ©΄μ—, μ•ˆμͺ½μ—μ„œ μ„ μ–Έν•œ λ³€μˆ˜λŠ” λ°”κΉ₯μͺ½ μŠ€μ½”ν”„μ—μ„œλŠ” μ‚¬μš©ν•  수 μ—†λ‹€.
μŠ€μ½”ν”„λŠ” 쀑첩이 κ°€λŠ₯ν•˜λ‹€. 마치 μ€‘μ²©λœ μšΈνƒ€λ¦¬μ™€ κ°™λ‹€.

λ°”κΉ₯μͺ½μ˜ μŠ€μ½”ν”„λŠ” μ „μ—­ μŠ€μ½”ν”„(Global Scope)라고 λΆ€λ₯Έλ‹€.
μ „μ—­μ˜ λ°˜λŒ€λ§μ€ 지역(local)으둜 전역이 μ•„λ‹Œ λ‹€λ₯Έ μŠ€μ½”ν”„λŠ” μ „λΆ€ 지역 μŠ€μ½”ν”„(local scope)이닀.

λ™μΌν•œ λ³€μˆ˜ μ΄λ¦„μœΌλ‘œ 인해 λ°”κΉ₯μͺ½ λ³€μˆ˜κ°€ μ•ˆμͺ½ λ³€μˆ˜μ— μ˜ν•΄ κ°€λ €μ§€λŠ”(shadow) μ΄λŸ¬ν•œ ν˜„μƒμ„ μ‰λ„μž‰(variable shadowing)이라고 λΆ€λ¦…λ‹ˆλ‹€.

πŸ“‚ μŠ€μ½”ν”„μ˜ μ’…λ₯˜

block scope 블둝 μŠ€μ½”ν”„

function scope ν•¨μˆ˜ μŠ€μ½”ν”„

block scope 블둝 μŠ€μ½”ν”„ (ν™”μ‚΄ν‘œ ν•¨μˆ˜λ‘œ λ‘˜λŸ¬μ‹Ό λ²”μœ„)

πŸ“‚ window 객체

  • var둜 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜ 및 μ „μ—­ ν•¨μˆ˜λŠ” window 객체에 μ†ν•˜κ²Œ λœλ‹€
    • λΈŒλΌμš°μ €μ—λŠ” windowλΌλŠ” 객체가 μ‘΄μž¬ν•œλ‹€.
      • λΈŒλΌμš°μ € 창을 λŒ€ν‘œν•˜λŠ” 객체이닀.
      • λΈŒλΌμš°μ € μ°½κ³Ό 관계없이 μ „μ—­ ν•­λͺ©λ„ λ‹΄κ³  μžˆλ‹€.
var myName = '김묑';
console.log(window.myName);
// 김묑

function foo() {
  console.log('bar');
}

console.log(foo === window.foo);
// true
  • μ „μ—­ λ³€μˆ˜μ— λ„ˆλ¬΄ λ§Žμ€ λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ§€ 말아라.
    • μ „μ—­ λ³€μˆ˜ : μ–΄λ””μ„œλ“  μ ‘κ·Ό κ°€λŠ₯ν•œ λ³€μˆ˜
    • νŽΈλ¦¬ν•œ λŒ€μ‹ , λ‹€λ₯Έ ν•¨μˆ˜ ν˜Ήμ€ λ‘œμ§μ— μ˜ν•΄ μ˜λ„ν•˜μ§€ μ•Šμ€ 변경이 λ°œμƒν•  수 있음
      - λΆ€μˆ˜ 효과(side effect) λ°œμƒ

πŸ“‚ μ„ μ–Έ μ—†λŠ” λ³€μˆ˜ ν• λ‹Ή κΈˆμ§€

  • μ„ μ–Έ ν‚€μ›Œλ“œ(var, let, const) 없이 λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜μ§€ 말아라.
function showAge() {
  age = 90; // ageλŠ” μ „μ—­ λ³€μˆ˜λ‘œ μ·¨κΈ‰ λœλ‹€.
  console.log(age); // 90
}

showAge();
console.log(age); // 90
console.log(window.age); // 90

ageλŠ” μ„ μ–Έν•œ 적 μ—†μœΌλ‚˜, 값을 ν• λ‹Ήν•˜λ©΄μ„œ 마치 var둜 μ„ μ–Έλœ μ „μ—­ λ³€μˆ˜μ²˜λŸΌ μž‘λ™ν•œλ‹€.

  • μ‹€μˆ˜λ₯Ό λ°©μ§€ν•˜κΈ° μœ„ν•΄ strict modeλ₯Ό μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
'use strict'

function showAge() {
  age = 90; // μ—¬κΈ°μ„œ μ—λŸ¬κ°€ λ°œμƒν•œλ‹€
  console.log(age); // 90
}

showAge();



πŸ’¬ ν΄λ‘œμ €

πŸ“‚ ν΄λ‘œμ € ν•¨μˆ˜μ˜ νŠΉμ§•

ν΄λ‘œμ €λŠ” "ν•¨μˆ˜μ™€ ν•¨μˆ˜κ°€ μ„ μ–Έλœ μ–΄νœ˜μ (lexical) ν™˜κ²½μ˜ 쑰합을 λ§ν•©λ‹ˆλ‹€. 이 ν™˜κ²½μ€ ν΄λ‘œμ €κ°€ μƒμ„±λœ μ‹œμ μ˜ 유효 λ²”μœ„ 내에 μžˆλŠ” λͺ¨λ“  지역 λ³€μˆ˜λ‘œ κ΅¬μ„±λœλ‹€." 라고 ν•©λ‹ˆλ‹€.

μ—¬κΈ°μ„œμ˜ ν‚€μ›Œλ“œλŠ” "ν•¨μˆ˜κ°€ μ„ μ–Έ"된 "μ–΄νœ˜μ (lexical) ν™˜κ²½"μž…λ‹ˆλ‹€.

const adder = x => y => x + y;
adder(5)97); // 12

typeof adder(5) // 'function'  // 리턴 값이 ν•¨μˆ˜μ˜ ν˜•νƒœλ‹€.

adder(5) // y => x + y // 리턴 값이 ν•¨μˆ˜μ˜ ν˜•νƒœλ‹€.

ν΄λ‘œμ € ν•¨μˆ˜μ˜ κΈ°λ³Έ ν˜•νƒœ

// const adder = x => y => x + y;
// μœ„μ˜ μ½”λ“œμ™€ λ™μΌν•˜κ²Œ μž‘λ™ν•˜λŠ” μ½”λ“œ
const adder = function (x) {
	return function (y) {   // 리턴 값이 ν•¨μˆ˜μ˜ ν˜•νƒœλ‹€.
    	return x + y;
    }
}


xκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” λ°”κΉ₯μͺ½μ— μžˆμœΌλ‹ˆ μ™ΈλΆ€ ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€.
그리고 yκ°€ μ„ μ–Έλœ ν•¨μˆ˜λŠ” 보닀 μ•ˆμͺ½μ— μžˆμœΌλ‹ˆ λ‚΄λΆ€ ν•¨μˆ˜λΌκ³  λΆ€λ₯Έλ‹€.
이 ν΄λ‘œμ € ν•¨μˆ˜λŠ” μŠ€μ½”ν”„κ°€ λΆ„λ¦¬λ˜μ–΄ μžˆλ‹€.

πŸ“‚ 데이터λ₯Ό λ³΄μ‘΄ν•˜λŠ” ν•¨μˆ˜

HTML λ¬Έμžμ—΄ 생성기

const tagMaker = tag => content => `<${tag}>${content}</${tag}>`

const divMaker = tagMaker('div');
divMaker('hello') // '<div>hello<div>'
divMaket('world') // '<div>world<div>'

const anchorMaker = tagMarker('a');
anchorMaker('go') // '<a>go</a>'
anchorMaker('study') // '<a>study</a>'

μ˜ˆμ œμ—μ„œ divMaker ν•¨μˆ˜λŠ” 'div'λΌλŠ” λ¬Έμžμ—΄μ„ tag λΌλŠ” λ³€μˆ˜μ— 담아두고 있으며, anchorMaker ν•¨μˆ˜λŠ” 'a'λΌλŠ” λ¬Έμžμ—΄μ„ tag에 담아두고 μžˆλ‹€.

ν΄λ‘œμ €λŠ” 이처럼 νŠΉμ • 데이터λ₯Ό μŠ€μ½”ν”„ μ•ˆμ— 가두어 λ‘” μ±„λ‘œ 계속 μ‚¬μš©ν•  수 있게 ν•΄ μ€€λ‹€.

πŸ“‚ μ •λ³΄μ˜ μ ‘κ·Ό μ œν•œ


ν΄λ‘œμ €λ₯Ό μ΄μš©ν•΄ λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό 단 ν•˜λ‚˜λ§Œ λ¦¬ν„΄ν•˜λŠ” 것에 κ·ΈμΉ˜μ§€ μ•Šκ³ , 객체에 λ‹΄μ•„ μ—¬λŸ¬ 개의 λ‚΄λΆ€ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λ„λ‘ λ§Œλ“ λ‹€.

μ •λ³΄μ˜ μ ‘κ·Ό μ œν•œ (μΊ‘μŠν™”)

만일 μŠ€μ½”ν”„λ‘œ value 값을 감싸지 μ•Šμ•˜λ”λΌλ©΄, value 값은 μ „μ—­ λ³€μˆ˜μ—¬μ•Όλ§Œ ν–ˆμ„ 것이닀. ν•˜μ§€λ§Œ makeCounterλΌλŠ” ν•¨μˆ˜κ°€ value 값을 λ³΄μ‘΄ν•˜κ³  있기 λ•Œλ¬Έμ—, μ „μ—­ λ³€μˆ˜λ‘œ λ”°λ‘œ λ§Œλ“€ ν•„μš”κ°€ μ—†λ‹€.

μ „μ—­ λ³€μˆ˜κ°€ 쒋지 μ•Šμ€ μ΄μœ λŠ”, μ „μ—­ λ³€μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜ ν˜Ήμ€ 둜직 등에 μ˜ν•΄ μ˜λ„λ˜μ§€ μ•Šμ€ 변경을 μ΄ˆλž˜ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 이λ₯Ό side effect라고 ν•©λ‹ˆλ‹€. side effectλ₯Ό μ΅œμ†Œν™”ν•˜λ©΄, μ˜λ„λ˜μ§€ μ•Šμ€ 변경을 쀄일 수 μžˆλ‹€. λ”°λΌμ„œ 이에 λ”°λ₯Έ 였λ₯˜λ‘œλΆ€ν„° 보닀 μ•ˆμ „ν•˜κ²Œ 값을 λ³΄ν˜Έν•  수 μžˆλ‹€.

ν΄λ‘œμ €λ₯Ό 톡해 λΆˆν•„μš”ν•œ μ „μ—­ λ³€μˆ˜ μ‚¬μš©μ„ 쀄이고, μŠ€μ½”ν”„λ₯Ό μ΄μš©ν•΄ 값을 보닀 μ•ˆμ „ν•˜κ²Œ λ‹€λ£° 수 μžˆλ‹€.

πŸ“‚ λͺ¨λ“ˆν™”

μž¬ν™œμš©μ΄ κ°€λŠ₯ν•œ makeCounerν•¨μˆ˜
μ—¬λŸ¬ 개의 counterλ₯Ό λ§Œλ“œλŠ” 것이 κ°€λŠ₯

const makeCounter = () => {
	let value = 0;
	
	return {
		increase: () => {
			value = value + 1
		},
		decrease: () => {
			value = value - 1
		},
		getValue: () => value
	}
}

const counter1 = makeCounter();

counter1.increase();
counter1.increase();
counter1.decrease();
counter1.getValue(); // 1

const counter2 = makeCounter();

counter1.decrease();
counter1.decrease();
counter1.decrease();
counter1.getValue(); // -3

// counter1κ³Ό counter2의 valueλŠ” μ„œλ‘œμ—κ²Œ 영ν–₯을 λΌμΉ˜μ§€ μ•ŠλŠ”λ‹€.

makeCounter에 μ˜ν•΄ λ¦¬ν„΄λœ κ°μ²΄λŠ”, makeCounterλ₯Ό μ‹€ν–‰ν•  λ•Œμ— μ„ μ–Έλ˜λŠ” value 값을 각자 λ…λ¦½μ μœΌλ‘œ κ°€μ§€κ²Œ λœλ‹€. λ”°λΌμ„œ counter1μ—μ„œμ˜ value와 counter2μ—μ„œμ˜ valueλŠ” μ„œλ‘œμ—κ²Œ 영ν–₯을 λΌμΉ˜μ§€ μ•Šκ³ , 각각의 값을 보쑴할 수 μžˆλ‹€.

이와 같이 ν•¨μˆ˜ μž¬μ‚¬μš©μ„±μ„ κ·ΉλŒ€ν™”ν•˜μ—¬, ν•¨μˆ˜ ν•˜λ‚˜λ₯Ό μ™„μ „νžˆ 독립적인 λΆ€ν’ˆ ν˜•νƒœλ‘œ λΆ„λ¦¬ν•˜λŠ” 것을 λͺ¨λ“ˆν™”라고 ν•œλ‹€.

ν΄λ‘œμ €λ₯Ό 톡해 데이터와 λ©”μ„œλ“œλ₯Ό 같이 λ¬Άμ–΄μ„œ λ‹€λ£° 수 μžˆλ‹€. 즉, ν΄λ‘œμ €λŠ” λͺ¨λ“ˆν™”에 μœ λ¦¬ν•˜λ‹€.

β€˜ν΄λ‘œμ € λͺ¨λ“ˆ νŒ¨ν„΄β€™μ˜ μ˜ˆμ‹œμž…λ‹ˆλ‹€. λ³€μˆ˜ valueλŠ” 직접 μˆ˜μ •ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ν•˜κ³ , λ¦¬ν„΄ν•˜λŠ” 객체가 μ œκ³΅ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν†΅ν•΄μ„œλ§Œ μ‘°μž‘μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ μΊ‘μŠν™”λ₯Ό ν•¨μœΌλ‘œμ¨ λ³€μˆ˜ valueλ₯Ό makeCounter ν•¨μˆ˜λ‘œ λ³΄μ‘΄ν•΄μ„œ μ „μ—­ λ³€μˆ˜λ‘œ μΈν•œ side effectλ₯Ό 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.



profile
λ¬΄μ‚¬μ™€μš”... μ—΄κ³΅ν–μš”...

0개의 λŒ“κΈ€