Skip to content

Latest commit

ย 

History

History
335 lines (229 loc) ยท 16.3 KB

javaScript.md

File metadata and controls

335 lines (229 loc) ยท 16.3 KB

this

  • this๋Š” ํ•จ์ˆ˜ ์„ ์–ธ ์‹œ์ ์— ์ •ํ•ด์ง€๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ˜ธ์ถœ ์‹œ์ ์— ์ •ํ•ด์ง.
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜์‹คํ–‰ ์‹œ์ ์—์„œ ๊ฐ์ฒด์˜ method์ด๋ฉด ๋ถ€๋ชจ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด ์•„๋‹ˆ๋ฉด ์ „์—ญ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ํ˜ธ์ถœ์‹œ this๋Š” ์ƒˆ๋กœ ์ƒ์„ฑ๋  ์ธ์Šคํ„ด์Šค ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • ์ „์—ญ์—์„œ this์— ์ ‘๊ทผํ• ๊ฒฝ์šฐ ์ „์—ญ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • arrow function ์•ˆ์—์„œ this์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ this๋Š” ํ•จ์ˆ˜ ์„ ์–ธ ์‹œ์ ์˜ ์ƒ์œ„ ์ปจํ…์ŠคํŠธ(๋ถ€๋ชจ ํ•จ์ˆ˜) this๋ฅผ ๊ฐ€๋ฆฌํ‚ด.
  • strict mode์—์„œ๋Š” ์•”๋ฌต์ ์œผ๋กœ this๊ฐ€ window ๋˜๋Š” global๋กœ ํ• ๋‹น๋ ๊ฒฝ์šฐ undefined๊ฐ€ ํ• ๋‹น๋จ.

์ฐธ์กฐํ˜• ํƒ€์ž… vs ์›์‹œํ˜• ํƒ€์ž…

  • ์›์‹œํ˜• ํƒ€์ž…์€ Number, Boolean, null, undefined, String, Symbol(ES6), BigInt(ES11)๊ฐ€ ์žˆ๊ณ ,

  • ์ฐธ์กฐํ˜• ํƒ€์ž…์€ ๊ฐ์ฒด(Object), ๋ฐฐ์—ด(Array), ํ•จ์ˆ˜(function), ์ •๊ทœ ํ‘œํ˜„์‹(regExp)๋“ฑ์ด ์žˆ๋‹ค.

  • ์›์‹œํ˜• ํƒ€์ž…์€ pass by value์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜๊ฑฐ๋‚˜ ๋ณต์‚ฌ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ๋œ๋‹ค.

  • ์ฐธ์กฐํ˜• ํƒ€์ž…์€ pass by reference์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๋ณ€๊ฒฝ ๋˜๊ฑฐ๋‚˜ ๋ณต์‚ฌ๋˜์–ด๋„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น ๋˜์ง€์•Š๊ณ  ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐ ํ•˜๊ฒŒ ๋œ๋‹ค.

  • ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๋ณต์‚ฌํ•œ ๊ฐ’์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„์‹œ ๋ณต์‚ฌ๋œ ๊ฐ’๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.

  • ์ฐธ์กฐํ˜• ํƒ€์ž…์„ ์›์‹œํ˜• ํƒ€์ž…์ฒ˜๋Ÿผ pass by value๋กœ ์‚ฌ์šฉํ• ๋ ค๋ฉด ์ „๊ฐœ์—ฐ์‚ฐ์ž๋‚˜ Object.assign์œผ๋กœ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ์•„๋‹Œ ๊นŠ์€ ๋ณต์‚ฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.

let str = 'str'
let copiedStr = string

let obj = { foo: '1', bar: '2' }
let copiedObj = obj

console.log(str, copiedStr) // 'str str'
copiedStr = 'string'
console.log(str, copiedStr) // 'str string'

console.log(obj, copiedObj) // '{ foo: '1', bar: '2' } { foo: '1', bar: '2' }'
copiedObj.foo = 3
console.log(obj, copiedObj) // '{ foo: '3', bar: '2' } { foo: '3', bar: '2' }'

const deepCopiedObj = { ...obj } // ์ „๊ฐœ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊นŠ์€ ๋ณต์‚ฌ

console.log(obj, deepCopiedObj) // '{ foo: '3', bar: '2' } { foo: '3', bar: '2' }'
deepCopiedObj.foo = 30
console.log(obj, deepCopiedObj) // '{ foo: '3', bar: '2' } { foo: '30', bar: '2' }'

Lexical scope๋ž€?

javascript function๋Š” ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํ˜ธ์ถœ๋œ ์‹œ์ ์ด ์•„๋‹ˆ๋ผ ํ•จ์ˆ˜๊ฐ€ ์ž‘์„ฑ๋œ ์ƒํ™ฉ์—์„œ ์Šค์ฝ”ํ”„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค.

const x = 'global'

function a() {
  console.log(x)
}

function b() {
  const x = 'local'
  a()
}
a() //global
b() //local์ด ์•„๋‹ˆ๋ผ global

substring vs substr vs slice

substring

์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ์‹œ์ž‘ index ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ๋งˆ์ง€๋ง‰ index

substr

์ฒซ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ์‹œ์ž‘ index ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ: ๊ธธ์ด

slice

substring์™€ ๋™์ผํ•˜์ง€๋งŒ ํŒŒ๋ผ๋ฏธํ„ฐ์— ์Œ์ˆ˜๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์—†์Œ

const target = 'hello world'
const substring = target.substring(2, 5) // 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ถ€ํ„ฐ 5 ์ธ๋ฑ์Šค ์ „๊นŒ์ง€ return: "llo"
const slice = target.slice(2, -6) // 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ถ€ํ„ฐ ๋’ค์—์„œ 6๋ฒˆ์งธ ์ธ๋ฑ์Šค ์ „๊นŒ์ง€ return: "llo"
const substr = target.substr(2, 5) // 2๋ฒˆ์งธ ์ธ๋ฑ์Šค ๋ถ€ํ„ฐ 5 ๊ธ€์ž return: "llo w"

apply vs call vs bind

apply

1๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ’์„ ๋ฐ›๊ณ  2๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐฐ์—ด์„ ๋ฐ›์•„์„œ ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฟŒ๋ ค์คŒ

call

1๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ this์— ๋ฐ”์ธ๋”ฉํ•  ๊ฐ’์„ ๋ฐ›๊ณ  2๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ถ€ํ„ฐ ํ•จ์ˆ˜์˜ 1๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋จ

bind

call๊ณผ ๋˜‘๊ฐ™์ง€๋งŒ ํ•จ์ˆ˜ ์‹คํ–‰์ด ์•ˆ๋จ

var val1 = 30
var val2 = 50
const obj = {
  val1: 40,
  val2: 90,
  sum(a, b) {
    return this.val1 + this.val2 + a + b
  },
}
console.log(obj.sum(0, 100)) //230
console.log(obj.sum.call(window, 0, 100)) //180
console.log(obj.sum.apply(window, [0, 100])) //180

throttle vs debounce

throttle: ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ํ›„ ์ผ์ • ์‹œ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „์— ๋‹ค์‹œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ

debounce: ์—ฐ์†๋˜์–ด ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ์ค‘ ํ˜ธ์ถœ๋œ ๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜๋งŒ ํ˜ธ์ถœํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ

throttle์€ ๋งจ์ฒ˜์Œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œํ›„ ์ผ์ • ์‹œ๊ฐ„์ „ ๊นŒ์ง„ ๋‹ค์‹œ ํ˜ธ์ถœ๋˜์ง€ ์•Š์ง€๋งŒ debounce๋Š” ์ผ์ • ์‹œ๊ฐ„๋™์•ˆ ํ˜ธ์ถœ๋˜์ง€ ์•Š์•„์•ผ์ง€ ํ˜ธ์ถœ๋œ ๋งˆ์ง€๋ง‰ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค

throttle์€ ์Šคํฌ๋กค ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ์‹œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  debounce๋Š” ajax ๊ฒ€์ƒ‰์— ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค

์ด๋ฒคํŠธ ์œ„์ž„(Event Delegation)์ด๋ž€?

  • ์ด๋ฒคํŠธ ์œ„์ž„(Event Delegation)์ด๋ž€ ๋‹ค์ˆ˜์˜ ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ์— ๊ฐ๊ฐ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋Œ€์‹  ๋ถ€๋ชจ ์š”์†Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
  • ๋ถ€๋ชจ Element์— ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•œ ํ›„ ์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›์€ event ์ธ์ž๋ฅผ ํ†ตํ•ด event๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ Element๋ฅผ ํ™•์ธํ•œ๋‹ค.

null vs undefined vs undeclared

null

  • null์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜๋„์ ์œผ๋กœ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†์Œ์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ํ• ๋‹นํ•˜๋Š” ๊ฐ’์ด๋‹ค.
  • ๋˜ํ•œ ๊ฐ์ฒด ์ฐธ์กฐ ๋งํฌ๋ฅผ ๋Š๊ธฐ ์œ„ํ•ด์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค, ํ•ด๋‹น ๊ฐ์ฒด ๋ณ€์ˆ˜๋ฅผ null๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์ด ์‹คํ–‰๋˜๋ฉฐ ํ•ด๋‹น ๊ฐ์ฒด๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐํ•œ๋‹ค.

undefined

  • ์„ ์–ธ๋งŒ ๋˜์–ด์ง€๊ณ  ํŠน์ • ๊ฐ’์ด ํ• ๋‹น๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ javascript ์—”์ง„์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด๋‹ค.
  • ํŠน๋ณ„ํžˆ ํ• ๋‹น๋œ ๊ฐ’์ด ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์–ธ์–ด๋“ค์ฒ˜๋Ÿผ null์ด ์•„๋‹ˆ๊ณ  undefiend๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
  • ๋˜ํ•œ ๊ฐ์ฒด๊ฐ€ ์†Œ์œ ํ•˜์ง€ ์•Š์€ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋  ๊ฒฝ์šฐ์—๋„ undefined๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

undeclared

  • undeclared ๋ณ€์ˆ˜๋ž€ ์„ ์–ธํ•˜์ง€ ์•Š์€ ์‹๋ณ„์ž์— ๊ฐ’์„ ํ• ๋‹นํ•œ ๋ณ€์ˆ˜์ด๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด undeclaredVar = โ€˜fooโ€™ ์™€ ๊ฐ™์ด var, let, const keyword๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋‹ค.
  • undeclared ๋ณ€์ˆ˜๋Š” ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜๋กœ ์ƒ์„ฑ ๋œ๋‹ค.

null vs undefiend

  • null์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ ๋ณ€์ˆ˜์— ๊ฐ’์ด ์—†์Œ์„ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋ฐ˜๋ฉด undefined๋Š” javascript ์—”์ง„์— ์˜ํ•ด ์ž๋™์œผ๋กœ ํ• ๋‹น๋œ๋‹ค.

ํด๋กœ์ €(Closure)๋ž€?

  • ํด๋กœ์ €๋ž€ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ์™ธ๋ถ€ ํ•จ์ˆ˜์˜ context์— ์ ‘๊ทผํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค.
  • ๋‚ด๋ถ€ํ•จ์ˆ˜๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ context์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€ํ•จ์ˆ˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜์˜ context์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์™ธ๋ถ€ํ•จ์ˆ˜์˜ context๋Š” ์™ธ๋ถ€ํ•จ์ˆ˜์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋ผ๋„ context์— ์ ‘๊ทผํ•˜๋Š” ๋‚ด๋ถ€ํ•จ์ˆ˜๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ๊นŒ์ง€ ๊ฐ™์ด ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š” ํŠน์„ฑ์ด์žˆ๋‹ค.
  • ํด๋กœ์ €๋Š” JavaScript ํ•จ์ˆ˜์˜ ๋ ‰์‹œ์ปฌ ์Šค์ฝ”ํ”„ ์„ฑ์งˆ์„ ํ™œ์šฉํ•œ ํŒจํ„ด์ด๋‹ค.
function generateCounter() {
  let count = 0
  return () => ++count
}

const counter = generateCounter()
counter() // 1
counter() // 2

Host Object vs Native Object

  • ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด(Host object)๋Š” ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ œ๊ณตํ•˜๋Š” window, XmlHttpRequest, HTMLElement ๋“ฑ์˜ DOM ๋…ธ๋“œ ๊ฐ์ฒด์™€ ๊ฐ™์ด ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ์ •์˜๋œ ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ๊ณผ ๋ธŒ๋ผ์šฐ์ € ์™ธ๋ถ€์—์„œ ๋™์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(Node.js)๋Š” ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ex) window, document, location, history, XMLHttpRequest, querySelectorAll, ...
  • ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐ์ฒด(Native Object)๋Š” ECMAScript ๋ช…์„ธ์„œ์— ์ •์˜๋œ object๋กœ Javascript์˜ ๋ชจ๋“  ์—”์ง„์— ๊ตฌํ˜„๋œ ํ‘œ์ค€๊ฐ์ฒด์ด๋‹ค.
  • ex) Date, Math, parseInt, eval, ...

๊ธฐ๋Šฅ ๊ฒ€์ถœ(feature detection) vs ๊ธฐ๋Šฅ ์ถ”๋ก (feature inference)

  • ๊ธฐ๋Šฅ ๊ฒ€์ถœ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ธฐ๋Šฅ X๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š”๊ฒƒ์ด๋‹ค.
  if('localStorage' in window)
  • ๊ธฐ๋Šฅ ์ถ”๋ก ๋„ ๊ธฐ๋Šฅ ๊ฒ€์ถœ์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ 'A๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋ฉด B๊ธฐ๋Šฅ๋„ ์ง€์›ํ•  ๊ฒƒ์ด๋‹ค.'๋ผ๋Š” ์ถ”๋ก ์ด ๋ฐ”ํƒ•์ด ๋œ๋‹ค(๋น„๊ถŒ์žฅ)
if ('localStorage' in window) {
  sessionStorage.add('foo', 'bar') // localstorage๊ฐ€ ์žˆ์œผ๋ฉด sessionStorage๋„ ์žˆ์„๊ฒƒ์œผ๋กœ ๊ธฐ๋Šฅ ์ถ”๋ก 
}

AJAX(Asynchronous JavaScript And XML)๋ž€?

  • AJAX๋ž€ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด XMLHttpRequest ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • JSON, XML, HTML ๊ทธ๋ฆฌ๊ณ  ์ผ๋ฐ˜ ํ…์ŠคํŠธ ํ˜•์‹ ๋“ฑ์„ ํฌํ•จํ•œ ๋‹ค์–‘ํ•œ ํฌ๋งท์„ ์„œ๋ฒ„์™€ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.
  • AJAX๋Š” ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜์ง€ ์•Š๊ณ ์„œ๋„ ์ˆ˜ํ–‰ ๋˜๋Š” ๋น„๋™๊ธฐ์‹ ํ†ต์‹ ์ด๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋น„๋™๊ธฐ์„ฑ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ Event๊ฐ€ ์žˆ์œผ๋ฉด ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ ์ผ๋ถ€๋ถ„๋งŒ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

โ€œํ˜ธ์ด์ŠคํŒ…(Hoisting)โ€์ด๋ž€?

  • ํ˜ธ์ด์ŠคํŒ…์ด๋ž€ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜๊ฐ€ ํ•ด๋‹น scope์˜ ๋งจ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๋Š” ํ˜„์ƒ์ด๋‹ค.
  • ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฒฝ์šฐ, var ํ‚ค์›Œ๋“œ๋กœ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ–ˆ์„ ๋•Œ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜๋ฉฐ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด context scope์˜ ์ตœ์ƒ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค(๋ณ€์ˆ˜ ํ• ๋‹น์€ ํ˜ธ์ด์ŠคํŒ… x).
  • let, const ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜์˜ ๊ฒฝ์šฐ ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€๋งŒ TDZ(temporal dead zone)์œผ๋กœ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜ ์‚ฌ์‹ค์ƒ ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ž…์žฅ์—์„œ๋Š” ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ ์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค.
  • ํ•จ์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜๋ฅผ "ํ•จ์ˆ˜ ์„ ์–ธ์‹(function)"์œผ๋กœ ์„ ์–ธ ํ–ˆ์„ ๊ฒฝ์šฐ ์ผ์–ด๋‚˜๋ฉฐ ํ•จ์ˆ˜์˜ ์„ ์–ธ ๋ฐ ํ• ๋‹น ๋ชจ๋‘ context scope์˜ ์ตœ์ƒ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ const ํ‚ค์›Œ๋“œ ๋“ฑ์„ ํ™œ์šฉํ•ด "ํ•จ์ˆ˜ ํ‘œํ˜„์‹"์œผ๋กœ ์„ ์–ธ ํ–ˆ์„ ๊ฒฝ์šฐ ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…๊ณผ ๋™์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ด๋ฒคํŠธ ๋ฒ„๋ธ”๋ง(Event Bubbling)์ด๋ž€?

  • ํ•˜์œ„ ์—˜๋ฆฌ๋จผํŠธ์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ฌ์„๋•Œ ํ•˜์œ„์—์„œ ์ƒ์œ„ ์—˜๋ฆฌ๋จผํŠธ๋กœ ์ด๋ฒคํŠธ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

load event vs DOMContentLoaded event

DOMContentLoaded event

  • HTML ์ด ๋ชจ๋‘ ๋กœ๋“œ๋˜๊ณ , DOM ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜์—ˆ์ง€๋งŒ, ์™ธ๋ถ€ ๋ฆฌ์†Œ์Šค(img, etc...)๊ฐ€ ์•„์ง ๋กœ๋“œ๊ฐ€ ๋˜์ง€ ์•Š์•˜์„ ๋•Œ, DOM ๋…ธ๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.

document load event

  • ๋ธŒ๋ผ์šฐ์ €์— ๋ชจ๋“  ๋ฆฌ์†Œ์Šค(img, style, script, etc...) ๊ฐ€ ๋กœ๋“œ ๋˜์—ˆ์„ ๋•Œ
  • ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ๋กœ๋“œ๋œ ์‹œ์ ์ด๊ธฐ์—, ๋กœ๋“œ๋œ image ์‚ฌ์ด์ฆˆ์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

==(๋™๋“ฑ ์—ฐ์‚ฐ์ž) vs ===(์ผ์น˜ ์—ฐ์‚ฐ์ž)

  • ๋™๋“ฑ ์—ฐ์‚ฐ์ž์€ ๋น„๊ตํ•˜๋Š” ๋‘ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ํ˜•๋ณ€ํ™˜์„ ํ•œ ๋’ค ๋น„๊ตํ•œ๋‹ค.
  • ์ผ์น˜ ์—ฐ์‚ฐ์ž๋Š” ๋น„๊ตํ•˜๋Š” ๋‘ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์ด ๋‹ฌ๋ผ๋„ ๋ฌด์‹œํ•˜๊ณ  ๋น„๊ตํ•œ๋‹ค.(ํƒ€์ž…์ด ๋‹ค๋ฅผ ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด false ๋ฐ˜ํ™˜)

Strict Mode๋ž€?

  • Strict Mode๋Š” ES5์—์„œ ์ถ”๊ฐ€ ๋˜์—ˆ์œผ๋ฉฐ "use strict;" ์„ ์ž…๋ ฅํ•˜๋ฉด ํ•ด๋‹น ์Šค์ฝ”ํ”„์˜ ๋‹ค์Œ ๊ตฌ๋ฌธ๋“ค๋ถ€ํ„ฐ ์ ์šฉ๋œ๋‹ค.
  • ์ด์ „ ๋ฒ„์ „์˜ JavaScript ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋“ค์€ use strict๊ตฌ๋ฌธ์„ ๋ฌด์‹œํ•œ๋‹ค.
  • Strict Mode์—์„œ๋Š” ์•”๋ฌต์  ์ „์—ญ ๋ณ€์ˆ˜ ์„ ์–ธ, ๋ณ€์ˆ˜ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์‚ญ์ œ, ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ์ค‘๋ณต, with ๋ฌธ์„ ์‚ฌ์šฉ ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • ๋˜ํ•œ ์ผ๋ฐ˜ ํ•จ์ˆ˜์•ˆ์—์„œ this๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด global๊ฐ์ฒด๊ฐ€ return๋˜๋Š” ๋Œ€์‹ , undefined๊ฐ€ return ๋œ๋‹ค.
  • Strict Mode๋Š” IE10 ์ด์ƒ๋ถ€ํ„ฐ ์ง€์›ํ•œ๋‹ค.

SPAํ”„๋กœ์ ํŠธ์—์„œ SEO(Search Engine Optimization)๋ฅผ ํ•˜๋Š”๋ฒ•

  • SPAํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์‹ฑ๊ธ€ ํŽ˜์ด์ง€์ด๊ธฐ ๋•Œ๋ฌธ์— SPAํ”„๋กœ์ ํŠธ ํฌ๋กค๋ง์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ๊ธ€์„ ์ œ์™ธํ•˜๊ณ  ๋„ค์ด๋ฒ„, ๋‹ค์Œ, ๋„ค์ดํŠธ๋“ฑ์˜ ํฌํ„ธ์‚ฌ์ดํŠธ์—์„œ ๊ฒ€์ƒ‰๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€์•Š๋Š”๋‹ค.
  • SEO๋ฅผ ํ•˜๊ธฐ์œ„ํ•ด์„  react๊ธฐ์ค€์œผ๋กœ Next.js๋‚˜ react-server๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ssr์„ ํ•˜๊ฑฐ๋‚˜ prerender(๋นŒ๋“œ ์‹œ์ ์—์„œ ๋ Œ๋”๋งํ•ด์„œ ์ •์  ํŒŒ์ผ(.html)์„ ์ƒ์„ฑํ•ด ๋‘”๋’ค http ์š”์ฒญ์ด ์˜ฌ๋•Œ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘” ์ •์  ํŒŒ์ผ์„ ์ „์†ก)์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ lambda@Edge๋ฅผ ํ™œ์šฉํ•ด ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ ํฌ๋กค๋Ÿฌ์ผ ๊ฒฝ์šฐ ์•Œ๋งž๋Š” open graph ํƒœ๊ทธ๋ฅผ ์‚ฝ์ž… ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Promise์˜ ์žฅ๋‹จ์ 

์žฅ์ 

  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‹œ ์ฝœ๋ฐฑ ํ—ฌ์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ ์ฒด์ด๋‹์„ ํ†ตํ•œ ์—ฐ์†์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹จ์ 

  • Promise์˜ ์ทจ์†Œ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค

immutable value vs mutable value

  • ์›์‹œ(primitive) ํƒ€์ž… ๊ฐ’๋“ค์€ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐ’(immutable value)์ด๋ฉฐ ์›์‹œ ํƒ€์ž… ์ด์™ธ์˜ ๋ชจ๋“  ๊ฐ’๋“ค์€ ๊ฐ์ฒด(Object) ํƒ€์ž…์ด๋‹ค. ๊ฐ์ฒด ํƒ€์ž…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๊ฐ’(mutable value)์ด๋‹ค.
  • ์›์‹œ ํƒ€์ž… ๊ฐ’๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋ฉด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์˜๋„์ ์œผ๋กœ ๊ฐ’์„ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ์žฌํ• ๋‹น ํ•˜์ง€์•Š๋Š”์ด์ƒ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€์•Š๋Š”๋‹ค.
const statement = 'I am an immutable value' // string์€ immutable value
const slicedStr = statement.slice(8, 17)

console.log(otherStr) // 'immutable'
console.log(statement) // 'I am an immutable value' ์›๋ณธ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
  • ํ•˜์ง€๋งŒ ์ฐธ์กฐ ํƒ€์ž… ๊ฐ’๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋ ์ˆ˜์žˆ๋‹ค.
const arr = []
console.log(arr) // []

const arr2 = arr.push(2) // Array.prototype.push ๋ฉ”์†Œ๋“œ๋Š” ์‹คํ–‰ ํ›„ arr์˜ length๋ฅผ ๋ฐ˜ํ™˜
console.log(arr) // [1] ์›๋ณธ arr์ด ๋ณ€๊ฒฝ๋Œ

var vs let vs const

  • var๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง€๊ณ  let, const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค.
  • ๋˜ํ•œ var๋Š” ๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…์ด ์ผ์–ด๋‚˜ ๋ณ€์ˆ˜์˜ ์„ ์–ธ์ด ์Šค์ฝ”ํ”„์˜ ๋งจ์œ„๋กœ ์˜ฌ๋ผ๊ฐ€๊ฒŒ๋œ๋‹ค.
  • var ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๊ธฐ ์ „์— ์ฝ์–ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, let๊ณผ const๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ์ฝ์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
  • var๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋‹ค์‹œ ์„ ์–ธํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ โ€˜letโ€™๊ณผ โ€˜constโ€™๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • var์™€ let๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ์žฌํ• ๋‹นํ•  ์ˆ˜ ์žˆ์ง€๋งŒ const๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์žฌํ• ๋‹น ๋ ์ˆ˜์—†๋‹ค.

Map vs Object

  • Object์˜ ํ‚ค์—๋Š” String๊ณผ Symbol์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Map์€ ํ•จ์ˆ˜, ๊ฐ์ฒด, ์›์‹œ ์ž๋ฃŒํ˜• ๋“ฑ ์–ด๋–ค ๊ฐ’๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Map์˜ ํ‚ค๋Š” ์‚ฝ์ž…์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜์ง€๋งŒ Object์˜ ํ‚ค๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Map์„ ์ˆœํšŒํ•˜๋ฉด ํ‚ค๋ฅผ ์‚ฝ์ž…ํ•œ ์ˆœ์„œ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค
  • Map์˜ ํฌ๊ธฐ๋Š” size ์†์„ฑ์œผ๋กœ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ Object์˜ ์†์„ฑ ์ˆ˜๋Š” ์ง์ ‘ ํŒ๋ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Map์€ ๋ฐ”๋กœ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, Object๋ฅผ ์ˆœํšŒํ•˜๋ ค๋ฉด ์–ด๋–ค ๋ฐฉ๋ฒ•์ด๋“  ํ‚ค์˜ ๋ฐฐ์—ด์„ ์–ป๊ณ , ๊ทธ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Object๋Š” ํ”„๋กœํ† ํƒ€์ž…์„ ๊ฐ€์ง€๋ฏ€๋กœ, ์ฃผ์˜ํ•˜์ง€ ์•Š์œผ๋ฉด ํ‚ค๊ฐ€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์žฆ์€ ํ‚ค์˜ ์ถ”๊ฐ€์™€ ์ œ๊ฑฐ๊ฐ€ ํ•„์š”ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” Map์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

Set vs Array

  • Array๋Š” ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, Set์€ ์ค‘๋ณต๋œ ๊ฐ’์„ ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Set์— ์ค‘๋ณต๋œ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ ์ถ”๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

for of vs for in

  • for in์€ ํ•ด๋‹น ์ปฌ๋ ‰์…˜์˜ key๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , for of๋Š” value๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • for in์€ ๊ฐ์ฒด์˜ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ(Enumerable)ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด true์ธ ํ”„๋กœํผํ‹ฐ๋งŒ ์ˆœํšŒํ•œ๋‹ค.
  • object.prototype.propertyIsEnumerable(propertyName)์„ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—ด๊ฑฐ ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • for of์€ ์ปฌ๋ ‰์…˜์—์„œ [Symbol.iterator]๊ฐ’์˜ ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค.

Array.sort

  • Array์˜ ๋‚ด์žฅ prototype ๋ฉ”์†Œ๋“œ์ธ sort๋Š” ์‹คํ–‰๋˜๋Š” ์—”์ง„์— ๋”ฐ๋ผ ๋‹ค๋ฅด์ง€๋งŒ, v8 ์—”์ง„์—์„œ๋Š” Timsort๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(nlog(n)) ๊ณต๊ฐ„ ๋ณต์žก๋„๋Š” O(n) ์ž…๋‹ˆ๋‹ค.
  • sort๋ฉ”์†Œ๋“œ๋Š” ์ธ์ž๋กœ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋„˜๊ฒจ์ค„ ๊ฒฝ์šฐ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋ฉฐ, ์ •๋ ฌ ์ˆœ์„œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์‹ถ์œผ๋ฉด ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ compareFunction๋ฅผ ๋„˜๊ฒจ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • compareFunction(a, b)์˜ ์ธ์ž๋กœ๋Š” ๋น„๊ตํ•  ๋ฐฐ์—ด์˜ ์›์†Œ ๊ฐ’ 2๊ฐœ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.
  • ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ฆฌํ„ด ๊ฐ’์ด ์Œ์ˆ˜๋ฉด a๋ฅผ b๋ณด๋‹ค ๋‚ฎ์€ ์ธ๋ฑ์Šค๋กœ ์ •๋ ฌํ•˜๊ณ 
  • 0 ์ด๋ฉด ๋‘ ์›์†Œ์˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์–‘์ˆ˜๋ฉด b๋ฅผ a๋ณด๋‹ค ๋‚ฎ์€ ์ธ๋ฑ์Šค๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

Element.getBoundingClientRect๋ž€?

  • ์š”์†Œ์˜ ํฌ๊ธฐ์™€ viewport์—์„œ์˜ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋ฅผ ๊ฐ์ฒด์— ๋‹ด์•„์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์†Œ๋“œ.
  • browser support: ie9+

requestAnimationFrame

  • requestAnimationFrame์ด๋ž€ ๋ชจ๋‹ˆํ„ฐ์˜ ์ฃผ์‚ฌ์œจ์— ๋งž๊ฒŒ ์—๋‹ˆ๋ฉ”์ด์…˜์„ ํ‘œํ˜„ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค requestAnimationFrame์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ์ดˆ๋‹น ์ตœ๋Œ€ ๋ชจ๋‹ˆํ„ฐ์˜ ์ฃผ์‚ฌ์œจ๋งŒํผ ํ˜ธ์ถœ๋œ๋‹ค.
  • ๋˜ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ๋Œ๋ฆฌ๊ฒŒ๋˜๋ฉด requestAnimationFrame์€ ๋ฉˆ์ถ”๊ฒŒ๋œ๋‹ค.
let count = 0
const el = document.querySelector('.counter')
function counter() {
  if (count >= 1000) return
  count++
  el.textContent = count
  requestAnimationFrame(counter)
}
requestAnimationFrame(counter)