π€μ€μ½νλ?
μ€μ½ν(scope)λ λ³μμ μμ, 맀κ°λ³μκ° μΈμ μ΄λμ μ μλλμ§ κ²°μ ν©λλ€.
μλ₯Ό λ€μ΄ ν¨μ 맀κ°λ³μκ° ν¨μ λ°λ μμμλ§ μ‘΄μ¬νλ κ²λ μ€μ½νμ μΌμ’ μ λλ€.
function f(x) {
return x + 3;
}
f(5);
x;
μμ μ½λλ₯Ό 보면 f(5)
λ₯Ό ν΅ν΄ ν¨μ f
λ₯Ό νΈμΆ νκΈ° μ κΉμ§λ x
λ μ‘΄μ¬νμ§ μκ³ ν¨μλ₯Ό μ€ννλ λμλ§ μ‘΄μ¬ ν ν¨μ λ°λλ₯Ό λ²μ΄λλ©΄ x
λ μ‘΄μ¬νμ§ μλ κ²μ²λΌ 보μ
λλ€.
xμ μ€μ½νκ° ν¨μ f
λΌκ³ λΆλ₯Ό μ μμ΅λλ€.
π€κ·ΈλΌ, λ³μκ° μ€μ½ν μμ μμ§ μλ€λ©΄, λ³μλ μ‘΄μ¬νμ§ μλ 건κ°μ?
- κΌ κ·Έλ°κ±΄ μλλλ€! μ€μ½νμ μ‘΄μ¬λ₯Ό λ°λμ ꡬλ³ν΄μ μκ°ν΄μΌ ν©λλ€.
[π‘μ€μ½νμ μ‘΄μ¬]
μ€μ½ν(κ°μμ±) |
|
μ‘΄μ¬ |
|
πJSμ μ μ μ€μ½ν
const x = 3;
function f() {
console.log(x);
console.log(y);
}
{
const y = 5;
f();
}
JSμ μ€μ½νλ μ μ μ λλ€.
μ¦, μ΄λ€ λ³μκ° ν¨μ μ€μ½ν μμ μλμ§ ν¨μλ₯Ό νΈμΆ ν λ μ μ μλ κ²μ΄ μλ μ μν λ μ μ μμ΅λλ€.
μμ μ½λλ₯Ό 보면
- x
λ ν¨μ f
λ₯Ό μ μ ν λ μ‘΄μ¬
- y
λ ν¨μ f
λ₯Ό μ μ ν λ λ―Έ μ‘΄μ¬ → λ€λ₯Έ μ€μ½νμ μ‘΄μ¬
- λ€λ₯Έ μ€μ½νμμ y
μ μΈ ν κ·Έ μ€μ½νμμ f
νΈμΆνλλΌλ y
λ f
μ€μ½νμ λ―Έ μ‘΄μ¬
ν¨μ f
λ μμ μ΄ μ μ λ λ μ κ·Όν μ μμλ μλ³μμλ μ κ·Όκ°λ₯νμ§λ§, νΈμΆν λ μ€μ½νμ μλ μλ³μμ μ κ·Ό λΆκ°νκ³ μ΄λ₯Ό μ μ μ€μ½νλΌκ³ ν©λλ€.
πμ μ μ€μ½ν μ’ λ₯
- μ μ μ€μ½ν(global scope)
- λΈλ‘ μ€μ½ν(block scope)
- ν¨μ μ€μ½ν(function scope)
[1. μ μ μ€μ½ν(global scope)]
μ μ μ€μ½νλ νλ‘κ·Έλ¨μ μμν λ μμμ μΌλ‘ μ£Όμ΄μ§λ μ€μ½νμ λλ€. μ€μ½νλ κ³μΈ΅μ μ΄λ©° νΈλ¦¬μ 맨 μλμ λ°νμ΄ λλ κ²μ΄ μ μ μ€μ½ν μ λλ€.
JavaScript νλ‘κ·Έλ¨μ μμν λ, μ¦ μ΄λ€ ν¨μλ νΈμΆνμ§ μμμλ μ€ν νλ¦μ μ μ μ€μ½νμ μμ΅λλ€.
μ μ μ€μ½νμμ μ μΈν κ²(μ μ λ³μ)μ 무μμ΄λ νλ‘κ·Έλ¨μ λͺ¨λ μ€μ½νμμ λ³Ό μ μμ΅λλ€.
π₯ νμ§λ§, μ μ μ€μ½νμ μμ‘΄νλκ²μ νΌν΄μΌ ν©λλ€.
let name = "Irena";
let age = 25;
function greet(){
console.log(`Hello, ${name}!`);
}
function getBirthYear(){
return new Date().getFullYear() - age;
}
μ΄ μ½λμ λ¬Έμ λ ν¨μκ° νΈμΆνλ μ€μ½νμ μμ‘΄μ μ
λλ€. greet
μ getBirthYear
λ μ μλ³μμ μμ‘΄νκ³ μμ΄ λ€λ₯Έ ν¨μμμ μ½κ² λ³κ²½μ΄ κ°λ₯ν©λλ€.
function greet(user){
console.log(`Hello, ${user.name}!`);
}
function getBirthYear(user){
return new Date().getFullYear() - user.age;
}
[2. λΈλ‘ μ€μ½ν(block scope)]
λΈλ‘ μ€μ½νλ κ·Έ λΈλ‘μ μ€μ½νμμλ§ λ³΄μ΄λ μλ³μλ₯Ό μλ―Έν©λλ€.
console.log('before block');
{
console.log('inside block');
const x = 3;
console.log(x);
}
console.log(`outside block : x = ${x}`);
x
λ λΈλ‘ μμμ μ μλκ³ , λΈλ‘μ λκ°λ μ¦μ x
λ μ€μ½ν λ°μΌλ‘ μ¬λΌμ§λ―λ‘ λ§μ§λ§ μ€μμ ReferenceError
κ° λ°μν©λλ€.
π₯ μ€μ½νκ° μ€μ²©λλ©΄ λ³μ μ¨κΉμ΄ λ°μν΄ νΌλμ΄ λ°μν μ μμ΅λλ€.
//μ€μ½ν λλ λ€μ μ€μ½ν μ€λ λ°©μ
{
const x = 'blue';
console.log(x);
}
console.log(typeof x);
{
const x = 3;
console.log(x);
}
console.log(typeof x);
//μ€μ½νκ° μ€μ²©λλ λ°©μ
{
let x = 'blue';
console.log(x);
{
let x = 3;
console.log(x);
}
console.log(3);
}
console.log(typeof x);
λ΄λΆ λΈλ‘μ x
λ μΈλΆ λΈλ‘μμ μ μν x
μ λ€λ₯Έ λ³μλ‘ μΈλΆ μ€μ½νμ x
λ₯Ό μ¨κΈ°λ ν¨κ³Όκ° μμ΅λλ€.
μ€ν νλ¦μΌλ‘ 보면,
- λ΄λΆ λΈλ‘μ λ€μ΄κ° μ λ³μ x
μ μ → λ λ³μκ° λͺ¨λ μ€μ½ν μμ μ‘΄μ¬
- λ³μμ μ΄λ¦μ΄ κ°μΌλ―λ‘ μΈλΆ μ€μ½νμ μλ λ³μμ μ κ·Όν λ°©λ² μμ΄μ§
→ λ³μλ₯Ό μ¨κΈ°λ©΄ κ·Έ λ³μλ ν΄λΉ μ΄λ¦μΌλ‘λ μ λ μ κ·Όν μ μμ΅λλ€.
π€κ·ΈλΌ, μ€μ½νμ λ³μκ° μ‘΄μ¬νλμ§ νμΈν μ μλ λ°©λ²μ΄ μμκΉμ?
- μ€μ½νμ κ³μΈ΅μ μΈ μ±κ²©μΌλ‘ μ΄λ€ λ³μκ° μ€μ½νμ μ‘΄μ¬νλμ§ νμΈνλ μ€μ½ν 체μΈμ΄ μ‘΄μ¬ν©λλ€. μ€μ½ν 체μΈμ μ‘΄μ¬νλ λ³μλ μ€μ½νμ μλ κ²μ΄λ©°, μ¨κ²¨μ§μ§ μμλ€λ©΄ μ κ·Ό κ°λ₯ν©λλ€.
[3. ν¨μ μ€μ½ν(function scope)]
globalFunc = function(){
console.log(blockVar);
}
let globalFunc; //μ μλμ§ μμ μ μ ν¨μ
{
let blockVar = 'a'; //λΈλ‘ μ€μ½νμ μλ λ³μ
globalFunc = function(){
console.log(blockVar);
}
}
globalFunc();
μμ μ½λλ globalFunc
λ₯Ό νΈμΆν μ μ€μ½νμμ λΉ μ Έ λμμμλ blockVar
μ μ κ·Όμ΄ κ°λ₯ν©λλ€.
π€ μ€μ½ν μμμ μ μν ν¨μλ₯Ό μ΄λ»κ² μ€μ½ν λ°μμ μ°Έμ‘°κ° κ°λ₯νκ°μ?
- λ°λ‘, ν΄λ‘μ (closure)λ‘ μΈν΄ μ°Έμ‘°κ° κ°λ₯ν©λλ€.
μμ μμ μμλ λΈλ‘ μ€μ½νμ λΆλͺ¨μΈ μ μ μ€μ½νκ° ν΄λ‘μ λ₯Ό νμ±ν©λλ€.
π’ν΄λ‘μ (closure)λ?
ν΄λ‘μ λ λ 립μ μΈ (μμ ) λ³μλ₯Ό κ°λ¦¬ν€λ ν¨μμ΄λ€. λλ, ν΄λ‘μ μμ μ μλ ν¨μλ λ§λ€μ΄μ§ νκ²½μ ‘κΈ°μ΅νλ€’. -MDN
ν¨μκ° νΉμ μ€μ½νμ μ κ·Όν μ μλλ‘ μλμ μΌλ‘ κ·Έ μ€μ½νμμ μ μνλ κ²½μ°, μ€μ½νλ₯Ό ν¨μ μ£Όλ³μΌλ‘ μ’νλ κ²μ λλ€.
let f;
{
let o = {node : 'Safe'};
f = function(){
return o;
}
}
let oRef = f();
oRef.note = "Not so safe after all!";
ν¨μλ ν΄λ‘μ μ λ€μ΄μλ μλ³μμ μ κ·Ό κ°λ₯ν©λλ€.
- μ€μ½ν μμμ ν¨μ μ μ μ ν΄λΉ μ€μ½ν λ μ€λ μ μ§λ©λλ€.
- μΌλ°μ μΌλ‘ μ κ·Ό λΆκ°ν κ²μ μ κ·Όν μ μλ ν¨κ³Ό μκΉλλ€.
μΆμ²
- Learning JavaScript μ± (μ΄μ λΈλΌμ΄ μ§μ)
'FRONT > JavaScript' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[JS] Cropper.js μ¬μ©κΈ° (0) | 2022.02.05 |
---|---|
[KENDO JS] DataSourceλ₯Ό gird, listviewμ μ¬μ¬μ©νκΈ° (0) | 2021.10.08 |
[JS] vanilla jsλ‘ λ¬΄ν μ€ν¬λ‘€(Infinite scroll) ꡬννκΈ° (0) | 2021.07.01 |
[JS] vanilla jsλ‘ Pagination ꡬννκΈ° (0) | 2021.07.01 |