function func() { }
const func = () => { };
μλ°μ€ν¬λ¦½νΈ ν¨μ μμ± λ°©λ²
ν¨μ μμ±νλ λ°©λ²μ μ΄ 3κ°μ§λ‘ λΆλ₯νλ€.
1. ν¨μ μ μΈλ¬Έ (Function Declaration)
2. ν¨μ ννμ (Function Expression)
3. νμ΄ν ν¨μ (Arrow Function)
κ·Έ λ°μ μΆκ°μ μΈ λ΄μ©μ ν¬μ€ν μ λ΄λλ‘ ν μμ μ΄λ€.
ν¨μ μ μΈλ¬Έ(Function Declaration)
- κ°μ₯ κΈ°λ³Έμ μΈ ν¨μ μμ± λ°©λ²μΌλ‘, `function ν¨μλͺ
() { }`μ μ¬μ©νλ©° ν¨μ μ μΈλ¬Έμ ν΅ν΄ ν¨μλ₯Ό μ μνκ³ μ΄λμλ νΈμΆ κ°λ₯νλ€.
- ν¨μ νΈμ΄μ€ν μ΄ μΌμ΄λλ€. →ν¨μ μ μΈ μ μ νΈμΆ κ°λ₯.
example() // ν¨μ νΈμ΄μ€ν
function example() {
console.log('Function Declaration');
}
λ³μνΈμ΄μ€ν
https://1000sang-dev.tistory.com/32
JavaScript λ³μ, ν¨μ μ μ λ° μ¬μ©
"Hoisting"Hoisting ?본격μ μΈ ν¬μ€ν μ μμ Hoisting(νΈμ΄μ€ν )μ΄λΌλ κ°λ μ λ¨Όμ μ΄ν΄νλ κ²μ΄ μ€μνλ€. μ΄μ: Hoisting `λͺ μ¬` λμ΄ μ¬λ¦¬κΈ°, λ€μ΄μ¬λ € λλ₯΄κΈ° Hoisting(νΈμ΄μ€ν )μ λ³μ μ μΈκ³Ό ν¨μ
1000sang-dev.tistory.com
ν΄λΉ ν¬μ€ν μ μ°Έκ³ νλλ‘ νμ.
ν¨μ ννμ (Function Expression)
- ν¨μλ₯Ό λ³μμ ν λΉνλ λ°©μμΌλ‘, ν¨μ μ μΈκ³Ό λ¬λ¦¬ λ³μ νΈμ΄μ€ν λ§ μΌμ΄λλ©° ν¨μλ μ μΈ μ΄νμλ§ μ¬μ©ν μ μλ€.
ννμ = μλ³μ(λ³μ) + μ°μ°μ(=) + 리ν°λ΄(ν¨μ)
- ν¨μ μ μΈλ¬Έ: ν¨μ νΈμ΄μ€ν λ°μ → ν¨μ μ μ μΈ(μ μ)
- ν¨μ ννμ: λ³μ νΈμ΄μ€ν λ°μ → λ³μ μ μ μΈ + ν λΉ
exmaple() // λ³μ νΈμ΄μ€ν
= ReferenceError: Cannot access 'example'
let exmaple = function() {
console.log('Function Expression');
};
https://ko.javascript.info/function-expressions
ν¨μ ννμ
ko.javascript.info
ν΄λΉ λ§ν¬μ μμΈνκ² μ€λͺ λμ΄μμΌλ μ°Έκ³ νλλ‘ νμ!
μ΅λͺ ν¨μμ κΈ°λͺ ν¨μ
- μ΅λͺ ν¨μ: μ΄λ¦μ΄ μλ ν¨μλ‘ μ£Όλ‘ ν¨μ ννμμ΄λ μ½λ°± ν¨μμ μ¬μ©λλ€.
- κΈ°λͺ ν¨μ: μ΄λ¦μ΄ μλ ν¨μλ‘, ν¨μ λ΄λΆμμ μ¬κ·μ νΈμΆμ΄λ λλ²κΉ μ μ μ©νλ€.
μ΅λͺ ν¨μ(Anonymous Function)μ νΈμ΄μ€ν
// console.log(example); // undefined (λ³μλ νΈμ΄μ€ν
λμ§λ§ μ΄κΈ°νλμ§ μμ)
// example(); // TypeError: example is not a function(ν¨μλ μμ§ ν λΉλμ§ μμ)
let example() = function() {
console.log('μ΅λͺ
ν¨μ');
};
example(); // 'μ΅λͺ
ν¨μ'
- `example`λ³μλ νΈμ΄μ€ν λμ΄ μ μΈμ λμ΄ μμ§λ§, μμ§ ν¨μκ° ν λΉλμ§ μμκΈ° λλ¬Έμ `undefined` μνμ΄λ€.
κΈ°λͺ ν¨μ(Name Function)μ νΈμ΄μ€ν
let example = function namedFunc() {
console.log('κΈ°λͺ
ν¨μ');
};
example(); // 'κΈ°λͺ
ν¨μ'
- ν¨μ ννμμμλ λ³μλ§ νΈμ΄μ€ν λλ©°, ν¨μλ λ³μμ ν λΉλ μ΄νμ νΈμΆ ν μ μλ€.
- λ΄λΆμ μΌλ‘ ν¨μ μ΄λ¦μΈ `namedFunc`μ ν¨μ λ΄λΆμμ μ¬κ·μ μΌλ‘ νΈμΆν λ μ¬μ© ν μ μμ§λ§, μΈλΆμμλ `example`λ‘λ§ μ κ·Όν μ μλ€.
ν¨μμ λ©μλμ μ°¨μ΄
- ν¨μ: λ¨μν μ μλ ν¨μ κ·Έμ체, μ μ 컨ν μ€νΈμμ μ€νλλ€.(`window`, `global`)
- λ©μλ: κ°μ²΄μ νλ‘νΌν°λ‘ μ μλ ν¨μλ‘, κ°μ²΄ λ΄μμ νΈμΆ. λ©μλ λ΄λΆμμ `this`λ λ©μλκ° μν κ°μ²΄λ₯Ό μ°Έμ‘°.
(this λ κ°λ―Έμ)
νμ΄ν ν¨μ (Arrow Function)
νμ΄ν ν¨μλ κΈ°μ‘΄μ `function()` λμ `() => {}` λ¬Έλ²μ μ¬μ©νλ€.
ν¨μ μ체μ this, arguments, super, new.target λ°μΈλ©μ κ°μ§ μλλ° μ¬κΈ°μ κ°μ₯ ν΅μ¬μ΄ `this` λ°μΈλ© λ°©μμμ κ°μ₯ ν° μ°¨μ΄κ° μλ€.
1. μΌλ° ν¨μ ννμ: λμ λ°μΈλ©(Dynamic Binding)
μΌλ° ν¨μλ νΈμΆλλ κ°μ²΄μ λ°λΌ `this`κ° κ²°μ λλ€. μ΄λ₯Ό λμ λ°μΈλ©μ΄λΌνκ³ νΈμΆλ κ°μ²΄μ λ°λΌ `this`κ° λ¬λΌμ§ μ μλ€.
var param = 'global param';
let printParam = function() {
console.log(this.param) // νΈμΆλ κ°μ²΄μ λ°λΌ `this` κ²°μ
}
let object = {
param: 'object param',
func: printParam
};
object.func(); // "object pram" (object κ°μ²΄κ° 'this'λ‘ λ°μΈλ©)
- `obejct.func()`κ° νΈμΆλλ©΄μ, `this`λ `object`λ₯Ό μ°Έμ‘°νκ² λμ΄ `object.param`μ΄ μΆλ ₯λλ€.
2. νμ΄ν ν¨μ ννμ: μ μ λ°μΈλ©(Lexical Binding)
νμ΄ν ν¨μλ `this`κ° κ³ μ λλ€. νμ΄ν ν¨μλ μμ μ μμ μ€μ½νμμ `this`λ₯Ό κ°μ Έμ€λ©°, μ΄λμ νΈμΆλμλμ§ μκ΄μμ΄ `this`λ ν¨μκ° μ μΈλ μμΉμ μν΄ κ²°μ λλ€.
var param = 'global param';
let printParam = () => {
console.log(this.param); // μμ μ€μ½νμ `this` μ¬μ© (μ μ κ°μ²΄)
}
let object = {
param: 'object param',
func: printParam
};
object.func(); // "global param" (νμ΄ν ν¨μλ `thisλ₯Ό μμ μ€μ½νμμ κ°μ Έμ΄)
`obejct.func()`λ₯Ό νΈμΆν΄λ, νμ΄ν ν¨μμ `this`λ μ μ κ°μ²΄(`windwo`)λ₯Ό μ°Έμ‘°νκ² λμ΄ `global param`μ΄ μΆλ ₯λλ€. νμ΄ν ν¨μλ λμ λ°μΈλ©μ΄ μλ μ μ λ°μΈλ©μ μ¬μ©νκΈ° λλ¬Έ.
μΌλ° ν¨μλ νΈμΆλ κ°μ²΄μ λ°λΌ `this`κ° κ²°μ λλ©° μ΄λ λμ λ°μΈλ©μ΄λ€.
νμ΄ν ν¨μλ μμ μ€μ½νμ μλ `this`λ₯Ό κ³ μ μ μΌλ‘ μ¬μ©νλ©°, μ΄λ μ μ λ°μΈλ©μ΄λ€.
- νμ΄ν ν¨μλ `this`κ° μκΈ° λλ¬Έμ λ©μλλ‘ μ¬μ©ν μ μλ€.
- νλ μ κ·Όμ΄ λΆκ°λ₯νλ€.
const object = {
field: '+νλ',
not_method: () => {
console.log('λ λ΄κ° μμ§λ λ©μλλ‘ λ³΄μ΄λ', this.filed); // undefined
}
};
object.not_method(); // 'λ λ΄κ° μμ§λ λ©μλλ‘ λ³΄μ΄λ undefined'
- νμ΄ν ν¨μλ λ©μλλ‘ μ¬μ©ν μ μμΌλ©°, `this`λ κ°μ²΄κ° μλ μμ μ€μ½νμ `this`λ₯Ό μ°Έμ‘°νκΈ° λλ¬Έμ `object.filed`λ₯Ό μΆλ ₯νμ§ λͺ»νκ³ `undefined`κ° λμ¨λ€.
var / let μ€μ½ν μ°¨μ΄μ μ μ κ°μ²΄μμμ `this` λ°μΈλ©
1. μ μ κ°μ²΄μ `this` (Global Execution Context)
μλ°μ€ν¬λ¦½νΈμμ μ μ 컨ν μ€νΈμμμ `this`λ λΈλΌμ°μ νκ²½μμλ μ μ κ°μ²΄μΈ `window`λ₯Ό κ°λ₯΄ν¨λ€. μ¦, μ μ μ€μ½νμμ `this`λ₯Ό νΈμΆνλ©΄ `window`κ°μ²΄κ° λ°νλλ€
console.log(this); // λΈλΌμ°μ μμλ window κ°μ²΄
2. `var`μ `let`μ μ°¨μ΄: λΈλ‘ μ€μ½νμ ν¨μ μ€μ½ν
https://1000sang-dev.tistory.com/32
JavaScript λ³μ, ν¨μ μ μ λ° μ¬μ©
"Hoisting"Hoisting ?본격μ μΈ ν¬μ€ν μ μμ Hoisting(νΈμ΄μ€ν )μ΄λΌλ κ°λ μ λ¨Όμ μ΄ν΄νλ κ²μ΄ μ€μνλ€. μ΄μ: Hoisting `λͺ μ¬` λμ΄ μ¬λ¦¬κΈ°, λ€μ΄μ¬λ € λλ₯΄κΈ° Hoisting(νΈμ΄μ€ν )μ λ³μ μ μΈκ³Ό ν¨μ
1000sang-dev.tistory.com
ν΄λΉ κΈμμλ μ€λͺ νμ§λ§ λ€μ νλ² μ€λͺ ν΄λ³΄κ² λ€.
μλ°μ€ν¬λ¦½νΈμμ `var`μ `let`μ μ€μ½νμ λ²μκ° λ€λ₯΄λ€. μ΄ μ°¨μ΄λ‘ μΈν΄ `this`μ λ³μ μ°Έμ‘°κ° λ€λ₯΄κ² μλν μ μλ€.
- `var`λ ν¨μ μ€μ½νλ₯Ό λ°λ₯Έλ€. μ¦, ν¨μ λ΄μμ μ μΈλ `var`λ³μλ ν΄λΉ ν¨μ μ 체μμ μ κ·Ό ν μ μλ€. κ·Έλ¦¬κ³ μ μ μ€μ½νμμ μ μΈλ `var` λ³μλ μ μκ°μ²΄μ νλ‘νΌν°κ° λλ€.
- `let`μ λΈλ‘ μ€μ½νλ₯Ό λ°λ₯Έλ€. μ¦, `let`μΌλ‘ μ μΈλ λ³μλ `{ }` λΈλ‘ λ΄μμλ§ μ κ·Όν μ μλ€. μ μ μ€μ½νμμ `let`λ³μλ₯Ό μ μΈν΄λ μ μκ°μ²΄μ νλ‘νΌν°κ° λμ§ μλλ€.
3. `var`μ `letμ μ¬μ©ν λ `this`μ λ³μ μ°Έμ‘°μ μ°¨μ΄
3.1. `var`λ₯Ό μ¬μ©ν κ²½μ°
- μ μμμ `var`λ‘ λ³μλ₯Ό μ μΈνλ©΄, ν΄λΉ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° λλ€. μ¦ `this`κ° μ μ κ°μ²΄λ₯Ό κ°λ₯΄ν¬ λ, `this`λ₯Ό ν΅ν΄μλ ν΄λΉ λ³μμ μ κ·Όν μ μλ€.
var param = 'global param';
function printParam() {
console.log(this.param); // thisλ μ μ κ°μ²΄(window)λ₯Ό κ°λ¦¬ν΄
}
printParam(); // "global param"
- `param`μ `var`λ‘ μ μΈλμκΈ° λλ¬Έμ, μ μ κ°μ²΄μ νλ‘νΌν°κ° λλ€.
- ν¨μμμ `this`λ μ μ κ°μ²΄λ₯Ό μ°Έμ‘°νκΈ° λλ¬Έμ, `this.param`μ `"global param"`μ μΆλ ₯νλ€.
3.2. `let`μ μ¬μ©ν κ²½μ°
- `let`μ λΈλ‘ μ€μ½νλ₯Ό λ°λ₯΄κΈ° λλ¬Έμ, μ μμμ `let`μΌλ‘ μ μΈλ λ³μλ μ μ κ°μ²΄μ νλ‘νΌν°κ° λμ§ μλλ€. λ°λΌμ `this`λ₯Ό ν΅ν΄ ν΄λΉ λ³μμ μ κ·Όν μ μλ€.
let param = 'global param';
function printParam() {
console.log(this.param); // thisλ μ¬μ ν μ μ κ°μ²΄(window)λ₯Ό κ°λ¦¬ν΄
}
printParam(); // undefined
- `param`μ `let`μΌλ‘ μ μΈλμμΌλ―λ‘ μ μ κ°μ²΄μ νλ‘νΌν°κ° λμ§ μλλ€.
- ν¨μμμ `this`λ μ¬μ ν μ μ κ°μ²΄λ₯Ό κ°λ¦¬ν€μ§λ§, `this.param`μ μ‘΄μ¬νμ§ μκΈ° λλ¬Έμ `undefined`κ° μΆλ ₯λλ€.
μ¬μ μΈ κ°λ₯ μ¬λΆ
μΌλ° ν¨μλ `varλ₯Ό μ¬μ©ν΄ μ¬μ μΈμ΄ κ°λ₯νλ€.
νμ΄ν ν¨μλ λ³μ μ μΈμ΄ νμμ μ΄λ―λ‘, μ¬μ μΈμ΄ λΆκ°λ₯νλ€ → νμ΄νν¨μ μ°λ μ΄μ κ° μ¬μ μΈμ λ°©μ§νλ μ΄μ μ΄κΈ°λ νλ€.
function hello() {
console.log('Hello');
}
function hello() {
console.log('World');
}
hello(); // 'World' (μ¬μ μΈ κ°λ₯)
let hello = () => {
console.log('Hello');
}
let hello = () => {
console.log('World');
}
// SyntaxError: Identifier 'hello' has already been declared (μ¬μ μΈ λΆκ°)
βΉοΈμ°Έκ³
[ASAC 6κΈ° κ°μμλ£]
https://ko.javascript.info/function-expressions
ν¨μ ννμ
ko.javascript.info
https://medium.com/@nilangav/function-statements-vs-function-expressions-in-javascript-91d4b8ed6c42
Function statements vs Function expressions in JavaScript
When working with javascript, you must’ve come across this jargon and you might’ve wondered what these really mean. So let me try to…
medium.com
'π»DEV-STUDY > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
JavaScript κ°μ²΄ μ μ λ° μ¬μ©κ³Ό JavaScript λͺ¨λ μμ€ν (0) | 2024.09.09 |
---|---|
JavaScript ν¨μ λ΄ thisμ λ©μλ λ΄ this μ°¨μ΄ (1) | 2024.09.09 |
μλ°μ€ν¬λ¦½νΈ μμ§μ μν λ°©μ = ν¨μ μ€ν μ리 (0) | 2024.09.05 |
JavaScript λ³μ, ν¨μ μ μ λ° μ¬μ© (0) | 2024.09.05 |
JavaScript ν¨μν νλ‘κ·Έλλ° ν¨λ¬λ€μ (4) | 2024.09.04 |