λͺ¨λ μμλ, μ μΈ ν€μλ var μ μ¬μ©νκ³ μλ€λ μ μ κ°μν΄μ£ΌμΈμ
μ€κ°μ€κ°, ES6 μ μ μΈ ν€μλ let, const κ΄λ ¨ 보좩 μ€λͺ μ΄ μμΌλ, μ°Έκ³ νλ©° μ½μ΄μ£ΌμΈμ! β¨
scope; μμ, λ²μ, μ ν¨νλ€
"μ ν¨νλ€" = "μ°Έμ‘°(μ κ·Ό)ν μ μλ€"μ€μ½νλ, μλ³μμ μ ν¨ λ²μ
ν¬κ² μ μ μ€μ½ν(Global Scope) μ μ§μ μ€μ½ν(Local Scope) λ‘ λλ©λλ€.
μ μ (ν¨μ, λΈλ‘{...} λ°μ μμ) μ λ³μλ₯Ό μ μΈνλ©΄, μ΄ λ³μλ μ΄λμλ μ§ μ°Έμ‘°ν μ μλ μ μ μ€μ½νλ₯Ό κ°λ μ μ λ³μκ° λ©λλ€.
( λΈλΌμ°μ μμ μ μμ, window
κ°μ²΄λ₯Ό λ»ν©λλ€. window
λ μ μ κ°μ²΄μ
λλ€. )
var global = 'global';
function hello() {
var local = 'local';
console.log(global);
console.log(local);
};
hello(); // 'global', 'local'
console.log(local); // ReferenceError: local is not defined
console.log(global); // 'global'
ν¨μ hello μμμλ, λ°μμλ λ³μ globalμ μ κ·Όν μ μμ΅λλ€.
μ μ μ΄λμλ μ§ μ κ·Όμ΄ κ°λ₯νκ³ , μ μμμ μ ν¨ν©λλ€.
βοΈκ·Έλ¬λ μ£Όμ π¨
μ μ λ³μλ μ¬μ©μ μ§μν΄μΌ ν©λλ€.
λ³μ μ΄λ¦μ΄ μ€λ³΅λ κ°λ₯μ±μ΄ λμμ§κ³ ,
κ·Έλ‘ μΈν μλμΉ μμ μ¬ν λΉμ΄ μν λ³νλ₯Ό μΌμΌν€λ―λ‘,
μ½λμ μ€λ₯λ₯Ό μμΈ‘νκΈ°κ° μ΄λ €μμ§κΈ° λλ¬Έμ μ¬μ©μ μ§μν΄μΌν©λλ€.
μλ JSλ λΈλ‘ λ 벨 μ€μ½νλ₯Ό μ¬μ©νμ§ μμ΅λλ€.
if(true) {
var x = 1;
};
console.log(x) // 1
λ³μ x
κ° ν¨μκ° μλ ifλ¬Έ
λΈλ‘ λ΄μμ μ μΈλμμ΅λλ€.
ν¨μ λ°μμ μ μΈλ λ³μλ μ½λ λΈλ‘({...})λ΄μμ μ μΈλμλ€ν μ§λΌλ λͺ¨λ μ μ μ€μ½νλ₯Ό κ°κ² λ©λλ€.
β¨ κ·Έλ¬λ ES6λΆν° νμν let, const ν€μλλ₯Ό μ¬μ©ν κ²½μ°,
μ½λ λΈλ‘({...})λ΄μμ λ³μκ° μ μΈλλ©΄, μ½λ λΈλ‘ λ΄μμλ§ λ³μκ° μλνκ² λ©λλ€.
if(true) {
let x = 1;
};
console.log(x) // ReferenceError: x is not defined
JSλ ν¨μ λ 벨 μ€μ½νλ₯Ό μ¬μ©ν©λλ€.
(let, const λ₯Ό μ¬μ©νλ©΄ λΈλ‘ λ 벨 μ€μ½νλ‘ μ¬μ©λ©λλ€.)
ν¨μ λ΄μμ μ μΈλ λ§€κ°λ³μμ λ³μλ ν¨μ μΈλΆμμ μ ν¨νμ§ μμ΅λλ€.
var a = 5;
function apple() {
var a = 10;
var b = 20;
}
console.log(a) // 5
console.log(b) // ReferenceError: b is not defined
λ³μ b
λ ν¨μ apple
λ΄μμ μ μΈλ μ§μ λ³μμ΄κΈ° λλ¬Έμ, ν¨μ μΈλΆμμ μ κ·Όν μ μμ΅λλ€. ( ReferenceError
λ°μ )
κ·Έλ¬λ ν¨μ(μ§μ, local)μμμμλ μ μλ³μλ₯Ό μ°Έμ‘°ν μ μμ΅λλ€.
μμμ μ€λͺ
λλ Έλ―, μ μ μ€μ½ν, μ μ λ³μλ μ΄λμλ μ§ μ κ·Όκ°λ₯ λ° μ°Έμ‘°ν μ μκΈ° λλ¬Έμ
λλ€.
var x = 100;
function apple() {
x = 300;
console.log(x);
};
apple(); // 300
console.log(x); // 300
λ΄λΆ ν¨μλ, μ μ λ³μλ λ¬Όλ‘ μ΄κ³ μμ ν¨μμμ μ μΈν λ³μμ μ κ·Ό/λ³κ²½μ΄ κ°λ₯ν©λλ€.
β¨ νμ§λ§ μ§κΈμ var λ³΄λ€ ES6λΆν° νμν let, const ν€μλμ μ¬μ©μ±μ΄ λκΈ° λλ¬Έμ,
ν¨μ λ 벨 μ€μ½νκ° μλ, λΈλ‘ λ 벨 μ€μ½νλ‘ μ΄ν΄νκ³ κ³μλ©΄ λ©λλ€.
νμ§λ§, JSμ κΈ°μ΄λ₯Ό μν΄ λͺ¨λ μμλ var ν€μλλ₯Ό μ¬μ©νμμ΅λλ€.
μ€μ²© μ€μ½νλ κ°μ₯ μΈμ ν μ§μμ μ°μ νμ¬ μ°Έμ‘°ν©λλ€.
var x = 10;
function sushi() {
var x = 50;
console.log(x); // 50
function salad() {
x = 100;
console.log(x); // 100
};
salad();
};
sushi(); // 100
console.log(x); // 10
ν¨μ sushi
μμ κ°μ₯ μΈμ ν x
λ λ°λ‘ μκΈ°μμ μ μμμ
λλ€.
ν¨μ salad
μμ κ°μ₯ μΈμ ν x
λ μμ ν¨μ λ΄μ x
λ₯Ό λ³κ²½μν¨ κ°μ κ°μ§κ³ μλ μκΈ°μμ μ μμμ
λλ€.
μ μμμμ console.log(x)
μμ κ°μ₯ μΈμ ν x
λ μ μμ μ μΈν λ³μμΈ x = 10
μ
λλ€.
μ΄μ²λΌ μμλ μκΈ°μμ μ local scope -> μμ μ μμ scope μμλ‘ μλ³μλ₯Ό μ°Ύμ΅λλ€.
λ νλμ μμ λ₯Ό λ³΄κ² μ΅λλ€.
var sushi = function() {
var a = 2, b = 3;
var salad = function() {
var b = 10, c = 30;
console.log(a += b+c);
};
salad();
};
sushi(); // ?
κ²°κ³Όκ°μ λλΌκ³ μΆλ ₯λ κΉμ? π€
νλμ© λ―μ΄λ΄
μλ€.
var sushi = function() {
var a = 2, b = 3;
// 1λ²μ§Έ μ§μ : a = 2, b = 3, c = c is not defined
var salad = function() {
var b = 10, c = 30;
// 2λ²μ§Έ μ§μ : a = 2, b = 10, c = 30
console.log(a += b+c);
// 3λ²μ§Έ μ§μ : a = 42, b = 10, c = 30
};
// 4λ²μ§Έ μ§μ : a = 2, b = 3, c = c is not defined
salad();
// 5λ²μ§Έ μ§μ : a = 42, b = 3, c = c is not defined
};
sushi();
JSλ μ±κΈ μ€λ λ λ°©μμΌλ‘ νμ€ νμ€μ© μ°¨λ‘λλ‘ μ½μ΄κ°λ©° λμν©λλ€.
μ μΈ μ , μ μΈ ν, μ€ν μ , μ€ν νλ§λ€ λ³μκ° λ³ννλ κ²λ€μ νμΈν μ μμ΅λλ€.
λ μ컬 μ€μ½νλ₯Ό μ€λͺ νκΈ° μμ, λ¨Όμ λμ μ€μ½νμ μ μ μ€μ½νμ λν΄ κ°λ¨ν μμλ΄ μλ€.
ππ»ββοΈ λμ μ€μ½ν (Dynamic Scope)
ν¨μλ₯Ό μ΄λμ νΈμΆ
νμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ
ππ»ββοΈ μ μ μ€μ½ν (Static Scope / Lexical Scope)
ν¨μλ₯Ό μ΄λμ μ μΈ
νμλμ§μ λ°λΌ μμ μ€μ½νλ₯Ό κ²°μ
JSλ₯Ό ν¬ν¨ν λλΆλΆμ νλ‘κ·Έλλ° μΈμ΄λ μ μ μ€μ½ν, μ¦ λ μ컬 μ€μ½νλ₯Ό λ°λ¦ λλ€
λ°λΌμ, JSλ ν¨μλ₯Ό μ μΈ
ν μμ μ λ°λΌ μμ μ€μ½νκ° κ²°μ λ©λλ€.
μ΄λ₯Ό Lexical Scoping μ΄λΌκ³ λΆλ¦
λλ€.
var x = 1;
function sushi() {
var x = 50;
salad();
}
function salad() {
console.log(x);
}
sushi(); // 1
salad(); // 1
μ μμ μ ν¨μ salad
μ μμ μ μΈλμμ΅λλ€.
λ°λΌμ ν¨μ salad
μμ μ€μ½νλ μ μμ΄ λκ³ , μ μμ μ μΈλ x
κ°μΈ 1μ μΆλ ₯νκ² λ©λλ€.
νΈμΆμ΄ λλ μμ μ μ€μ½νκ° κ²°μ μ΄ λμ§ μκΈ° λλ¬Έμ, x
κ°μ 50μ΄ λ μ μμ΅λλ€.
var x = 10;
function sushi() {
y = 20;
console.log(x + y);
}
sushi(); // 30
ν¨μ sushi
μμ μλ y
λ μ μΈλμ§ μμ λ³μμ
λλ€.
κ·Έλ¬λ μ°Έμ‘° μλ¬κ° λ°μνμ§ μμ΅λλ€. μ μΈλμ§ μμ μλ³μ y
κ° λ§μΉ μ μΈλ λ³μμ²λΌ λμν©λλ€.
μ΄λ μ μΈνμ§ μμ μλ³μμ κ°μ ν λΉνλ©΄ μ μ κ°μ²΄(window)μ νλ‘νΌν°κ° λκΈ° λλ¬Έμ
λλ€.
μ μΈ ν€μλ(var, let, const)κ° μμ΄ λ³μλ₯Ό μ μΈν κ²½μ°, μ μ λ³μλ‘ μ μΈλ©λλ€.
y = 20
μ΄ window.y = 20
μΌλ‘ μ μκ°μ²΄ νλ‘νΌν°λ‘ λμ μμ±μ΄ λλ κ²μ
λλ€. λ°λΌμ, λ§μΉ μ μ λ³μμ²λΌ λμνκ² λ©λλ€.
μ΄λ¬ν νμμ μ묡μ μ μ(Implicit Global) μ΄λΌκ³ ν©λλ€.
μμ λ§νλ―, μ μ λ³μλ μ΅λν μ¬μ©μ μ§μν΄μΌ νλ―λ‘,
μ μΈ ν€μλμμ΄ λ³μλ₯Ό μ΄κΈ°ννλ©΄ μλ©λλ€.
ν¨μ λ΄μμ λ³μλ₯Ό μ μΈν μ§λΌλ, μ μΈ ν€μλκ° μλ€λ©΄ μ μ λ³μλ‘ λμνκΈ° λλ¬Έμ
λλ€.
βοΈκ·Έλ¬λ Strict Mode(μ격 λͺ¨λ)λ₯Ό μ¬μ©νλ©΄ JSλ μμ²λΌ λ¬Έλ²μ μΌλ‘ μ€μν μ μλ λΆλΆλ€μ μλ¬λ‘ νλ¨ν΄μ€λλ€.
'use strict'
var x = 10;
function sushi() {
y = 20; // ReferenceError: y is not defined
console.log(x + y);
}
sushi();
https://poiemaweb.com/js-scope
https://www.nextree.co.kr/p7363/
https://velog.io/@nittre/JavaScript-Scopeμ€μ½νμ-Closureν΄λ‘μ -μ 리
https://hanamon.kr/javascript-μ€μ½νμ-λ³μμ μΈν€μλ-μ°¨μ΄μ /
https://ljtaek2.tistory.com/140
μ½μ΄μ£Όμ
μ κ°μ¬ν©λλ€! ν° λμμ΄ λμκΈ°λ₯Ό λ°λλλ€ πͺ
νΉμ μλͺ»λ μ λ³΄κ° μλ€λ©΄, μλ €μ£ΌμΈμ!!
λΉ λ₯Έ μμ νλλ‘ νκ² μ΅λλ€ π₯Ή
λ€μ κ²μλ¬Όμ,
μ€μ½ν 체μΈκ³Ό κ΄λ ¨νμ¬ μ€ν 컨ν
μ€νΈ κ΄λ ¨ κΈμ 벨λ‘κΉ
ν μμ μ
λλ€.
κ·ΈλΌ See You ! ππ» β¨