// 전역 스코프에 변수와 함수를 선언합니다.
let globalVariable = "I am a global variable";
function globalFunction() {
console.log("I am a global function");
}
// 전역 스코프에 선언된 변수와 함수는 어디서든 접근할 수 있습니다.
console.log(globalVariable); // "I am a global variable"
globalFunction(); // "I am a global function"
// 함수 내부에서도 전역 변수와 함수에 접근할 수 있습니다.
function anotherFunction() {
console.log(globalVariable); // "I am a global variable"
globalFunction(); // "I am a global function"
}
anotherFunction();
globalVariable
과 globalFunction()
은 전역 스코프에서 선언되었기 때문에 어디서든 접근할 수 있습니다. anotherFunction()
내에서도 전역 변수와 함수에 접근할 수 있습니다.// 이 부분이 코드의 최상단입니다.
let globalVariable = 10;
function globalFunction() {
console.log("This is a global function");
}
console.log(globalVariable); // 10
globalFunction(); // This is a global function
globalFunction()
함수가 다른 함수보다 상위에 위치해 있다면, 이 함수는 전역 스코프에 속하게 됩니다. 따라서 globalFunction()
함수는 코드의 최상단에 선언된 함수 입니다.function exampleFunction() {
var localVariable = "Local"; // 지역 변수
console.log(localVariable); // "Local"
}
exampleFunction(); // Local
console.log(localVariable); // ReferenceError: localVariable is not defined
LocalVariable
은 exampleFunction()
함수 내에서 선언된 지역 변수 입니다. 이 변수는 exampleFunction()
함수 내에서만 유효하며, 함수 외부에서는 접근할 수 없습니다. 함수 외부에서 LocalVariable
을 참조하려고 하면 ReferenceError가 발생합니다.{}
)로 둘러싸인 코드 블록 내에서 변수가 유효한 스코프를 의미합니다.let
과 const
키워드를 사용하여 도입되었습니다.if
, for
, while
등과 같은 제어문 또는 함수 내에서 중괄호로 둘러싸인 영역이 블록 스코프 입니다.if (true) {
let blockVariable = "I'm a block scoped variable";
console.log(blockVariable); // 출력: "I'm a block scoped variable"
}
console.log(blockVariable); // ReferenceError: blockVariable is not defined
if
문 내에서 선언된 변수는 해당 if
문 블록 내에서만 유효하며, 외부에서는 접근할 수 없습니다.var
키워드로 선언된 변수는 함수 스코프를 가집니다. var
로 선언된 변수는 선언된 함수의 전체 범위, 즉 함수 내부에서는 어디에서나 사용할 수 있습니다. 즉, 함수 내부의 어떤 위치에서든 해당 변수를 참조하거나 값을 변경하는 것이 가능합니다.function loop() {
for (var i = 0; i < 7; i++) {
console.log(i);
}
console.log(i, "번호끝!");
}
loop();
/*
0
1
2
3
4
5
6
7 번호끝!
*/
var
키워드를 사용하여 i
변수를 선언했습니다. i
에 접근할 수 있습니다.var
키워드를 사용하여 i
변수를 선언하였기 때문에, for 반복문이 끝난 후에도 i
변수에 접근할 수 있습니다. 이 때문에 console.log(${i} 번호끝!)
코드는 7 번호끝!
을 콘솔에 출력합니다. 이는 for 반복문의 조건 i < 7
때문에 i
값이 7이 되면 반복문이 종료되지만, i
값 자체는 변하지 않기 때문입니다.var
는 함수 스코프를 가지기 때문에 함수 내부에서는 어디에서나 사용할 수 있습니다.function loop() {
for (let i = 0; i < 7; i++) {
console.log(i);
}
console.log(i, "번호끝!");
}
loop();
/*
0
1
2
3
4
5
6
ReferenceError: i is not defined
*/
let
키워드를 사용하여 i
변수를 선언했습니다.i < 7
이라는 조건식 때문에 i의 값이 7이 되는 순간 for문은 종료되고, 그 때문에 i
의 값 7은 출력되지 않습니다. for문 내의 console.log(i)
는 i
가 0부터 6까지의 값일 때만 실행되기 때문입니다. 그래서 결과적으로 콘솔에는 0부터 6까지의 숫자만 출력됩니다.let
과 const
는 블록 스코프의 특성을 가집니다. 그래서 for문 내에서 i
를 let
로 선언한 순간, 변수 i
는 for문 내에서만 접근이 가능하기 때문에 for문 외부에서는 i
에 접근할 수 없습니다.변수 | 재할당 | 재선언 | 유효범위 |
---|---|---|---|
let | 가능 | 불가 | 블록 스코프 및 함수 스코프 |
const | 불가 | 불가 | 블록 스코프 및 함수 스코프 |
var | 가능 | 불가 | 함수스코프 |
스코프 체인(scope chain)은 자바스크립트에서 변수의 접근을 결정하는 메커니즘입니다. 이 메커니즘은 함수와 블록 내에서 변수를 어떻게 검색하고 접근할지를 정의합니다. 스코프 체인은 내부 함수나 블록에서 변수를 찾지 못했을 때 외부 스코프에서 변수를 검색하는 과정을 설명합니다.
스코프 체인은 내부 스코프에서 변수를 찾지 못하면 외부 스코프로 이동하여 변수를 검색합니다. 이는 전역 스코프에 도달할 때까지 계속 됩니다.
function test() {
if (true) {
const blockScoped = "I am block scoped";
var functionScoped = "I am function scoped";
}
console.log(functionScoped); // 출력: I am function scoped
console.log(blockScoped); // ReferenceError: blockScoped is not defined
}
test();
const
로 선언된 blockScoped
변수는 블록 스코프이며, 블록을 벗어나면 접근할 수 없습니다.var
로 선언된 functionScoped
변수는 함수 스코프이며, 함수 내 어디서든 접근할 수 있습니다.const animal = "Lion";
function outerFunction() {
const animal = "Elephant";
function innerFunction() {
console.log(animal);
}
innerFunction();
}
outerFunction(); // 출력: Elephant
innerFunction
은 outerFunction
내부에 정의된 함수입니다.innerFunction
에서 animal
변수를 검색할 때, 먼저 innerFunction
의 스코프에서 찾습니다. 해당 스코프에서 변수를 찾지 못할경우 outerFunction
의 스코프로 이동하여 변수를 찾습니다. 여기서 animal
변수를 발견하고 "Elephant"
를 출력합니다.ReferenceError
가 발생합니다.변수의 생명 주기는 변수가 메모리에 존재하는 기간을 의미합니다. 변수의 생명 주기는 변수의 선언 위치와 스코프에 따라 달라집니다.
var globalVar = "I am a global variable";
// 애플리케이션 시작 시 globalVar가 메모리에 할당됩니다.
function myFunction() {
var functionScopedVar = "I am function scoped";
console.log(functionScopedVar);
}
myFunction(); // 함수가 호출될 때 functionScopedVar가 생성됩니다.
// 함수가 종료되면 functionScopedVar는 메모리에서 소멸됩니다.
{
let blockScopedVar = "I am block scoped";
console.log(blockScopedVar); // 접근 가능
}
// 블록이 종료되면 blockScopedVar는 메모리에서 소멸됩니다.