Input + Output = True

javascript ๊ธฐ๋ณธ ์ง€์‹ ์ •๋ฆฌ ๋ณธ๋ฌธ

๐ŸŽจFrontEnd/Javascript

javascript ๊ธฐ๋ณธ ์ง€์‹ ์ •๋ฆฌ

IOTrue 2022. 12. 15. 16:41

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ์ง€์‹

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ธฐ๋ณธ ์ง€์‹์„ ์•Œ์•„๋ณด์ž!
๋ชฉํ‘œ: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ์ž‘๋™ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

 

๐Ÿ˜Ž JavaScript์˜ ์ž๋ฃŒํ˜•๊ณผ JavaScript๋งŒ์˜ ํŠน์„ฑ์€?
[๋А์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด]

*๋А์Šจํ•œ ํƒ€์ž… : ํƒ€์ž… ์—†์ด ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ

  -์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜ ์„ ์–ธ : const, let

 

*๋™์  ์–ธ์–ด

  -์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€์ˆ˜์—๋Š” ์–ด๋– ํ•œ ํƒ€์ž…์˜ ๊ฐ’๋„ ๋™์ ์œผ๋กœ (์žฌ)ํ• ๋‹น ๊ฐ€๋Šฅ.

let val = 42 // Number
val = "๋ฌธ์ž๋กœ ๋ณ€๊ฒฝ" // String
val = true // Boolean

 

[JavaScript ํ˜• ๋ณ€ํ™˜]

*์ „๋‹ฌ๋˜๋Š” ๊ฐ’์„ ์˜๋„์ ์œผ๋กœ ์›ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜ ํ•ด์ฃผ๋Š” ๊ฒƒ

let resultStr = "123";
console.log(typeof resultStr); // string

let resultNum = Number(resultStr); // ๋ฌธ์ž์—ด "123"์ด ์ˆซ์ž 123์œผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค.
console.log(typeof resultNum); // number


[==, ===]

*๋น„๊ต ์—ฐ์‚ฐ์ž : ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์–ด๋–ค ๊ฐ’ ๋˜๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์™€ ๋น„๊ตํ•  ๋•Œ ์‚ฌ์šฉ

  - == : ๋™๋“ฑ ์—ฐ์‚ฐ์ž, '๊ฐ™๋‹ค'์˜ ์˜๋ฏธ/ ํƒ€์ž…๊ณผ ์ƒ๊ด€ ์—†์ด '๊ฐ’'์ด ๊ฐ™์œผ๋ฉด true 

2022 == 2022 // true
2022 == '2022' // true

  - === : ์ผ์น˜ ์—ฐ์‚ฐ์ž, '์—„๊ฒฉํ•˜๊ฒŒ' ๊ฐ™๋‹ค ์˜ ์˜๋ฏธ/ '๊ฐ’'๊ณผ 'ํƒ€์ž…'๊นŒ์ง€ ๊ฐ™์•„์•ผ true

2022 === 2022 // true
2022 === '2022' // false -> [ ์ˆซ์žํ˜• === ๋ฌธ์žํ˜• -> false ]

 

[๋А์Šจํ•œ ํƒ€์ž…(loosely typed)์˜ ๋™์ (dynamic) ์–ธ์–ด์˜ ๋ฌธ์ œ์ ๊ณผ ๋ณด์™„ ๋ฐฉ๋ฒ•]

*๋ฌธ์ œ์  : ๋ณ€์ˆ˜์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ํƒ€์ž…์ด ๋“ค์–ด์™€ ํƒ€์ž… ์—๋Ÿฌ ๋“ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

console.log(1+10)
> 11
console.log(1+'10') // ์ˆซ์ž 1 + ๋ฌธ์ž 10
> 110

 

*๋ณด์™„ ๋ฐฉ๋ฒ• : ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ(TypeScipt)์™€ ๊ฐ™์€ ๊ฐ•๋ ฅํ•œ ํƒ€์ž…(๋ณ€์ˆ˜ ์„ ์–ธ ์‹œ ํƒ€์ž…๋„ ์„ ์–ธ)์˜ ํ™•์žฅ ์–ธ์–ด์˜ ์‚ฌ์šฉ

//js = ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ

//js
const result = 2022

//ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ - js์˜ ๋А์Šจํ•œ ํƒ€์ž…์„ ๋ณด์™„ํ•˜๊ณ ์ž ๋‚˜์˜จ js์˜ ํ™•์žฅ ์–ธ์–ด
const result : number = 2022

 

[undefined์™€ null์˜ ์ฐจ์ด ๋น„๊ต]

*undefined : ๋ณ€์ˆ˜ ์„ ์–ธ ํ›„ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ์ƒํƒœ

*null : ๋ณ€์ˆ˜ ์„ ์–ธ ํ›„ null ์ด๋ผ๋Š” ๊ฐ’์ด ์ฃผ์–ด์ง„ ์ƒํƒœ -> "๊ฐ’์ด ์—†๊ฒŒ ํ• ๊ฒŒ"

let obj1
obj1 // undefind

let obj2 = null
obj2 // null

 

๐Ÿ˜Ž JavaScript ๊ฐ์ฒด์™€ ๋ถˆ๋ณ€์„ฑ์ด๋ž€ ?
[๊ธฐ๋ณธ(์›์‹œ)ํ˜• ๋ฐ์ดํ„ฐ์™€ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ]

*๊ธฐ๋ณธํ˜•๊ณผ ์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ์˜ ์ฐจ์ด : ๊ธฐ๋ณธํ˜•์—๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ํ• ๋‹นํ•˜๊ณ , ์ฐธ์กฐํ˜•์—๋Š” ๊ฐ’์ด ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’์„ ํ• ๋‹น(์ฐธ์กฐ)ํ•จ

  -๊ธฐ๋ณธ(์›์‹œ)ํ˜• ๋ฐ์ดํ„ฐ : Number, String, Boolean, null, undefined ๊ฐ€ ์žˆ์œผ๋ฉฐ ES6 ์—์„œ๋Š” Symbol ๋„ ์ถ”๊ฐ€ ๋˜์—ˆ์Œ
  -์ฐธ์กฐํ˜• ๋ฐ์ดํ„ฐ : ๋Œ€ํ‘œ์ ์œผ๋กœ ๊ฐ์ฒด(Object)๊ฐ€ ์žˆ๊ณ , ๊ทธ ํ•˜์œ„์— ๋ฐฐ์—ด(Array), ํ•จ์ˆ˜(Function), ์ •๊ทœํ‘œํ˜„์‹(RegExp) ๋“ฑ์ด ์žˆ์œผ๋ฉฐ, ES6์—์„œ๋Š” Map, Set, WeakMap, WeakSet ๋“ฑ๋„ ์ถ”๊ฐ€ ๋˜์—ˆ์Œ

// ์ฃผ์†Œ ๊ฐ’์€ ์ž„์˜๋กœ ์„ค์ •ํ•จ
// ๊ธฐ๋ณธํ˜•
let a = 2022;
let b = 2023;
// let a : 100 ์ด๋ผ๋Š” ์ฃผ์†Œ (์ €์žฅ) ๊ณต๊ฐ„์„ ํ™•๋ณด → a๋ผ๋Š” ๋ณ€์ˆ˜์™€ ๋งค์นญ
// a = 2022 : a๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ณ  → ๋งค์นญ๋œ ์ฃผ์†Œ ๊ฐ’์ธ 100์˜ (view) ๊ณต๊ฐ„์— 2022๋ฅผ ํ• ๋‹น
// let b : 101 ์ด๋ผ๋Š” ์ฃผ์†Œ (์ €์žฅ) ๊ณต๊ฐ„์„ ํ™•๋ณด → b๋ผ๋Š” ๋ณ€์ˆ˜์™€ ๋งค์นญ
// b = 2023 : b๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ฐพ๊ณ  → ๋งค์นญ๋œ ์ฃผ์†Œ ๊ฐ’์ธ 101์˜ (view) ๊ณต๊ฐ„์— 2023๋ฅผ ํ• ๋‹น

// ์ฐธ์กฐํ˜•
let obj = {
    a : 1,
    b : 'b'
};

let obj2 = obj;
obj2.a = 1000;
console.log(obj2.a); // 1000
console.log(obj.a); // 1000
// let obj : 100 ์ด๋ผ๋Š” ์ฃผ์†Œ (์ €์žฅ) ๊ณต๊ฐ„์„ ํ™•๋ณด → obj ๋ผ๋Š” ๋ณ€์ˆ˜์™€ ๋งค์นญ
// {ํ”„๋กœํผํ‹ฐ, ๊ฐ’} ์ด ๋‹ด๊ธธ 1000์ด๋ผ๋Š” ๊ณต๊ฐ„์„ ํ™•๋ณด {ํ”„๋กœํผํ‹ฐ, ๊ฐ’} ๋งค์นญ (obj์ฃผ์†Œ 100์€ 1000์„ ๋งค์นญ)
// 1011์ด๋ผ๋Š” ๊ณต๊ฐ„์— aํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋งค์นญ
// 1012๋ผ๋Š” ๊ณต๊ฐ„์— bํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์„ ๋งค์นญ
// > @100 : @1000 / @1000 : {a : @1011, b : @1012} / @1011 : 1 / @1012 : 'b' ์˜ ํ˜•ํƒœ

// ๋ณต์‚ฌ๋œ obj2๋Š” 101์˜ ๊ณต๊ฐ„์— obj2๋ฅผ ํ™•๋ณด ํ›„ obj์˜ ๊ฐ’์ด ์žˆ๋Š” 100์˜ ๊ฐ’ @1000์„ 'ํ• ๋‹น'
// @1000์˜ ํ”„๋กœํผํ‹ฐ a์™€ ๋งค์นญ๋œ @1011์˜ ๊ฐ’ 1์„ 1000์œผ๋กœ ๋ณ€๊ฒฝ
// ๋ณต์‚ฌ๋œ obj2์˜ a์™€ ์›๋ณธ obj์˜ a์˜ ๊ฐ’์ด ๋ชจ๋‘ ๋ณ€๊ฒฝ ํ›„ ์ถœ๋ ฅ

 

[๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•]

*๋ถˆ๋ณ€ ๊ฐ์ฒด : ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป

  -freeze()์™€ const๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

let person = {
	name : 'kim'
}
person.name = 'lee'
console.log(person.name) // lee

// freze() ์‚ฌ์šฉ
let person = {
	name : 'kim'
}
Object.freeze(person)
person.name = 'lee' // ๋ฌด์‹œ ๋จ
console.log(person.name) // kim

// ํ•˜์ง€๋งŒ
let person = {
	name : 'kim'
}
Object.freeze(person)
person = {
    age : 15
}
console.log(person) // { age: 15 } > freeze๋Š” ๋™๊ฒฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์žฌํ• ๋‹น์€ ๊ฐ€๋Šฅํ•˜๋‹ค

// const์™€ ์กฐํ•ฉํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค
const person = {
	name : 'kim'
}
Object.freeze(person)
person.name = 'lee' // ๋ฌด์‹œ๋จ
person = {
    age : 15
}
console.log(person) // TypeError: Assignment to constant variable.

 

[์–•์€ ๋ณต์‚ฌ์™€ ๊นŠ์€ ๋ณต์‚ฌ]

*์–•์€ ๋ณต์‚ฌ : ๊ฐ์ฒด์˜ '์ฐธ์กฐ' ๊ฐ’('์ฃผ์†Œ' ๊ฐ’)์„ ๋ณต์‚ฌ

*๊นŠ์€ ๋ณต์‚ฌ : ๊ฐ์ฒด์˜ '์‹ค์ œ' ๊ฐ’์„ ๋ณต์‚ฌ

// ๊นŠ์€ ๋ณต์‚ฌ > ๊ธฐ์กด ๊ฐ’์— ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š๋Š”๋‹ค.
const a = 'a';
let b = 'b';

c = b
b = c
c = 'c'

console.log(a); // 'a';
console.log(b); // 'b';
console.log(c); // 'c'

// ์–•์€ ๋ณต์‚ฌ > ๊ธฐ์กด ๊ฐ’์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค
const a = {
    one: 1,
    two: 2,
};

let b = a;
b.one = 3;

console.log(a); // { one: 3, two: 2 }
console.log(b); // { one: 3, two: 2 }

 

๐Ÿ˜Ž ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ๋Š” ๋ฌด์—‡์ผ๊นŒ ?
[์Šค์ฝ”ํ”„, ํ˜ธ์ด์ŠคํŒ…, TDZ]

*์Šค์ฝ”ํ”„: ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„

  -์ „์—ญ ์Šค์ฝ”ํ”„  : ํŒŒ์ผ ๋‚ด ์–ด๋””์„œ๋“  ์ฐธ์กฐ ๊ฐ€๋Šฅ

  -์ง€์—ญ ์Šค์ฝ”ํ”„  : ํ•ด๋‹น ๋ธ”๋Ÿญ(ํ•จ์ˆ˜) ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

let scope = 'global' // ์ „์—ญ ์Šค์ฝ”ํ”„
function func(){
    let scope = 'local' // ์ง€์—ญ ์Šค์ฝ”ํ”„
    console.log(scope)
}
func() // 'local'
console.log(scope) // 'global'

 

*ํ˜ธ์ด์ŠคํŒ… : ์ฝ”๋“œ ์‹คํ–‰ ์ „ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ

function dog(result) {
  console.log(`๊ฐ•์•„์ง€๋Š” ${result}`)
}
dog('๊ท€์—ฝ๋‹ค') // ๊ฐ•์•„์ง€๋Š” ๊ท€์—ฝ๋‹ค

// ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด๋„ ์ •์ƒ ์ž‘๋™
dog('๊ท€์—ฝ๋‹ค') // ๊ฐ•์•„์ง€๋Š” ๊ท€์—ฝ๋‹ค
function dog(result) {
  console.log(`๊ฐ•์•„์ง€๋Š” ${result}`) // ๋ฏธ๋ฆฌ ํ• ๋‹น
}

// ํ•จ์ˆ˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ํ•จ์ˆ˜ ์„ ์–ธ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ถ€ํ„ฐ ํ• ๋‹น


[ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์—์„œ ํ˜ธ์ด์ŠคํŒ… ๋ฐฉ์‹์˜ ์ฐจ์ด]

*ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ

function declaration(){
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}
declaration()

*ํ•จ์ˆ˜ ํ‘œํ˜„์‹

const expression = function(){
	console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}
expression()

 

*ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ๊ณผ ํ•จ์ˆ˜ ํ‘œํ˜„์‹์˜ ์ฐจ์ด : ํ˜ธ์ด์ŠคํŒ…์˜ ์ฐจ์ด

  -ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ : ํ•จ์ˆ˜ ์ „์ฒด๋ฅผ ํ˜ธ์ด์ŠคํŒ…

  -ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ๋ณ€์ˆ˜์˜ ์„ ์–ธ๋ถ€ ํ• ๋‹น๋ถ€๋ฅผ ๋‚˜๋ˆ„์–ด์„œ ํ˜ธ์ด์ŠคํŒ… > ์„ ์–ธ๋ถ€ ๋จผ์ € ํ˜ธ์ด์ŠคํŒ…

declaration() // 'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // ReferenceError: Cannot access 'expression' before initialization

function declaration(){
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}

const expression = function(){
	console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}

// ์œ„์˜ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค

function declaration(){ // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ : ์ „์ฒด ํ˜ธ์ด์ŠคํŒ…
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}
const expression // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ๋ณ€์ˆ˜๋งŒ ์„ ์–ธ

declaration() // ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ ์‹คํ–‰ :'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // ReferenceError: Cannot access 'expression' before initialization

function(){ // ํ•จ์ˆ˜ ํ‘œํ˜„์‹ : ํ• ๋‹น๋ถ€๋Š” ๊ทธ๋Œ€๋กœ
	console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}

// ์ •์ƒ ์ž‘๋™ํ•˜๋ ค๋ฉด
const expression = function(){
	console.log('ํ•จ์ˆ˜ ํ‘œํ˜„์‹')
}
declaration() // 'ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ'
expression() // 'ํ•จ์ˆ˜ ํ‘œํ˜„์‹'
function declaration(){
	console.log('ํ•จ์ˆ˜ ์„ ์–ธ๋ฌธ')
}


[let, const, var, function์˜ ์‹คํ–‰ ์›๋ฆฌ]

*let, const, var

  -var๋Š” ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ / let, const๋Š” ๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„

  -var์€ ํ˜ธ์ด์ŠคํŒ… ๊ฐ€๋Šฅ / let, const๋Š” ํ˜ธ์ด์ŠคํŒ… ์—๋Ÿฌ ๋ฐœ์ƒ (TDZ ์กด์žฌ)

  -var๋Š” ์ด๋ฏธ ์„ ์–ธ๋œ ์ด๋ฆ„๊ณผ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•ด๋„ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง€ ์•Š์ง€๋งŒ

     let, const๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๋ฅผ ์ค‘๋ณต ์„ ์–ธํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ
  -var, let์€ ๋ณ€์ˆ˜ ์„ ์–ธ์‹œ ์ดˆ๊ธฐ ๊ฐ’์„ ์ฃผ์ง€ ์•Š์•„๋„ ๋˜์ง€๋งŒ const๋Š” ๋ฐ˜๋“œ์‹œ ์ดˆ๊ธฐ๊ฐ’์„ ํ• ๋‹นํ•ด์•ผ ํ•จ

  -var, let์€ ์„ ์–ธ ํ›„ ๊ฐ’ ๋ณ€๊ฒฝ(์žฌํ• ๋‹น) ๊ฐ€๋Šฅ / const๋Š” ์„ ์–ธ๋œ ๊ฐ’ ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅ (๊ฐ์ฒด์•ˆ์˜ ํ”„๋กœํผํ‹ฐ ๋ณ€๊ฒฝ๊นŒ์ง€ ์ œํ•œ์€ ์•„๋‹˜)

// const ๊ฐ’ ๋ณ€๊ฒฝ

const arr = ["a"]
const name = arr
console.log("name 1 : ", name) // name 1 : ['a']
arr.push("b")
console.log("name 2 : ", name) // name 2 : ['a', 'b']

/*
๋ฐฐ์—ด, ๊ฐ์ฒด๋Š” ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด๊ธฐ ๋•Œ๋ฌธ์— ์š”์†Œ๋‚˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•ด๋„
๋‚ด์šฉ๋งŒ ๋ณ€๊ฒฝ ๋˜๊ณ  ํ•ด๋‹น ์ฃผ์†Œ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ 
const๋กœ ์„ ์–ธ๋˜์—ˆ์–ด๋„ ์š”์†Œ, ์†์„ฑ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
*/

 

*function

  -ํ•จ์ˆ˜ ์ž‘์„ฑ > ๋ธŒ๋ผ์šฐ์ € ์—”์ง„์ด ํ•จ์ˆ˜์˜ ์ด๋ฆ„ (ex-function name(){})์„ ์‹๋ณ„์ž๋กœ ์ €์žฅ > ํ•จ์ˆ˜ ๊ฐ์ฒด ์ƒ์„ฑ ํ›„ ์ฐธ์กฐ

> ํ•จ์ˆ˜ ์‹คํ–‰ ๊ตฌ๋ฌธ์—์„œ name์„ ๋งŒ๋‚˜๋ฉด ๊ฐ’์„ ๊ฐ€์ ธ์˜ด > ๊ทธ ๋‹ค์Œ ๊ตฌ๋ฌธ์ด () ์ด๋ผ๋ฉด ์‹คํ–‰

>๋งŒ์•ฝ ์Šค์ฝ”ํ”„์—์„œ ์‹๋ณ„์ž๋ฅผ ๋ชป ์ฐพ์•˜๋‹ค๋ฉด, ์ฐธ์กฐ ์—๋Ÿฌ(ReferenceError) ์ถœ๋ ฅ

> ์‹๋ณ„์ž๋Š” ์ฐพ์•˜์ง€๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” ํƒ€์ž…์ด๋ผ๋ฉด ํƒ€์ž… ์—๋Ÿฌ(TypeError) ์ถœ๋ ฅ

not(); // ReferenceError: not is not defined
let name= 'kim';
name(); // TypeError: name is not a function

 

[์‹คํ–‰ ์ปจํ…์ŠคํŠธ์™€ ์ฝœ ์Šคํƒ]

*์‹คํ–‰ ์ปจํ…์ŠคํŠธ : ์‹คํ–‰ํ•  ์ฝ”๋“œ์— ์ œ๊ณตํ•  ํ™˜๊ฒฝ ์ •๋ณด๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฐ์ฒด

  -Global Execution context
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์—”์ง„์ด ์ฒ˜์Œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ „์—ญ ๊ณต๊ฐ„ ์ƒ์„ฑ.

๊ทธ ๊ณผ์ •์—์„œ ์ „์—ญ ๊ฐ์ฒด์ธ Window Object (Node๋Š” Global) ์ƒ์„ฑ ๋ฐ this๊ฐ€ Window ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฅดํ‚ด.

  -Function Execution context
ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ๋  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœ ๋œ ํ•จ์ˆ˜๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜ ๊ณต๊ฐ„ ์ƒ์„ฑ.
๋ชจ๋“  ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ž์‹ ๋งŒ์˜ ํ•จ์ˆ˜ ๊ณต๊ฐ„์„ ๊ฐ€์ง.

 

*์ฝœ ์Šคํƒ (FIFO ์„ ์ž…์„ ์ถœ)

์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋ฅผ ์ฝœ์Šคํƒ์— ์Œ“์•„์˜ฌ๋ฆฐ ํ›„ ์‹คํ–‰ํ•˜์—ฌ ์ฝ”๋“œ์˜ ํ™˜๊ฒฝ๊ณผ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•จ

let name = 'kim'
function b(){
    console.log('B ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค')
}
function a(){
    console.log('a ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค')
    b()
}
a()
// a ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค
// B ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค

>[global context] 
>[global context][a์‹คํ–‰ ์ปจํ…์ŠคํŠธ]
>[global context][a์‹คํ–‰ ์ปจํ…์ŠคํŠธ][b์‹คํ–‰ ์ปจํ…์ŠคํŠธ]
>[global context][a์‹คํ–‰ ์ปจํ…์ŠคํŠธ]
>[global context]

 

[์Šค์ฝ”ํ”„ ์ฒด์ธ, ๋ณ€์ˆ˜ ์€๋‹‰ํ™”]

*์Šค์ฝ”ํ”„ ์ฒด์ธ : ์Šค์ฝ”ํ”„๋ฅผ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •

const myName = 'kim'

function first() {
  const age = 20

  function second() {
    const job = 'developer'

    console.log(`hi, I'm ${myName}. I'm a ${age}-old ${job}`)
    // Hi, I'm Serzhul. I'm a 30-old developer
  }

  second()
}

first()

// second ํ•จ์ˆ˜์—์„œ myName ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •
// ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํƒ์ƒ‰ > ์ƒ์œ„ first ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„์—์„œ ํƒ์ƒ‰ > ๊ทธ ์ƒ์œ„ '์ „์—ญ' ์Šค์ฝ”ํ”„์—์„œ ํƒ์ƒ‰

 

*๋ณ€์ˆ˜ ์€๋‹‰ํ™” : ์ง์ ‘์ ์œผ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด ์•ˆ ๋˜๋Š” ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ง‰๋Š” ๊ฒƒ

// ์ฆ‰์‹œ ์‹คํ–‰ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ์€๋‹‰ํ™”
(function () {
    let a = 'a';
  })();
  
  console.log(a); // a is not defined
  
// ํด๋กœ์ € ์ƒ์„ฑ์„ ํ†ตํ•œ ์€๋‹‰ํ™” > _name ์€๋‹‰ํ™”
function welcome(name) {
    let _name = name;
    return function () {
        console.log('welcome, ' + _name);
    };
}

let a = new welcome('kim');
let b = new welcome('lee');

a._name ="์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹œ๋„" // ReferenceError: Cannot access 'a' before initialization

a() // welcome, kim
b() // welcome, lee

 

ํœด ๋“œ๋””์–ด ์ •๋ฆฌ ๋!๐Ÿ˜€

 

 

 

 

์ถ”๊ฐ€ ํฌ์ŠคํŒ…

https://iotrue.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%ED%98%B8%EC%9D%B4%EC%8A%A4%ED%8C%85%EA%B3%BC-TDZ

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ

๐Ÿ˜Ž ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜ธ์ด์ŠคํŒ…๊ณผ TDZ โœ… ํ˜ธ์ด์ŠคํŒ… ํ˜ธ์ด์ŠคํŒ…(Hoisting) ์ฝ”๋“œ ์‹คํ–‰ ์ „ ๋ณ€์ˆ˜์™€ ํ•จ์ˆ˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฏธ๋ฆฌ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ. ์ฝ”๋“œ์—์„œ ์„ ์–ธ๋œ ์œ„์น˜์™€ ์ƒ๊ด€์—†์ด ๋ณ€์ˆ˜ ๋ฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค

iotrue.tistory.com

 

Comments