안녕하세요! AT SOPT WEB YB 윤소은입니다.
세미나를 들으면서 스코프에 대한 내용이 나와서 블로그를 작성하면 좋겠다는 생각이 들었습니다. 구체적으로 언급된 만큼 중요한 개념이라고 생각했습니다. 또 그동안 제대로 이해하지 못하고 사용한 것 같아 완벽 이해를 위해 주제로 선정하였습니다!
자바스크립트의 스코프는 다른 언어의 스코프와 구별되는 특징이 있습니다. 또 var 키워드로 선언한 변수와 let, const로 선언한 변수의 스코프도 다르게 동작합니다. 따라서 스코프에 대해 명확하게 정리하는 것이 중요합니다!
스코프란? (식별자가 유효한 범위)
변수와 함수가 어디까지 참조되고 사용될 수 있는지를 나타내는 것
스코프(scope)는 자바스크립트를 포함한 모든 프로그래밍 언어의 기본적이며 중요한 개념으로, 변수와 함수의 유효 범위를 의미합니다. 다시 말해, 변수와 함수가 어디까지 참조되고 사용될 수 있는지를 나타내는 것이 바로 스코프입니다.
모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 자신이 선언된 위치에 따라 다른 코드에서 식별자를 참조할 수 있는 유효 범위가 결정되는데, 이때 이 유효 범위를 스코프라고 합니다. 즉, 스코프는 식별자가 유효한 범위를 말합니다.
스코프 내에서 식별자는 유일해야 하지만, 다른 스코프에서는 같은 이름의 식별자를 사용할 수 있습니다. 즉, 스코프는 네임스페이스(namespace)의 역할을 합니다. 네임스페이스란 개체를 구분할 수 있는 범위를 나타내는 말로, 일반적으로 하나의 이름 공간에서는 하나의 이름이 단 하나의 개체만을 가리키게 됩니다.
+) 네임스페이스란?
네임스페이스(namespace)란 프로그램 내에서 식별자(변수, 함수, 클래스 이름 등)가 충돌하지 않도록 구분짓는 논리적 영역으로, 네임스페이스를 사용하면 동일한 이름의 식별자가 다른 네임스페이스에 존재하더라도 충돌 없이 사용할 수 있다.
식별자 결정
자바스크립트 엔진은 스코프 내에서 이름이 같은 두 개의 변수 중 어떤 변수를 참조할 것인지 결정해야 하며, 이를 식별자 결정(identifier resolution)이라고 합니다.
var x = 'global';
function printLocalX() {
var x = 'local';
console.log(x); // 'local'
}
printLocalX();
console.log(x); // 'global'
위 코드에서 전역에 선언된 x 변수와 printLocalX 함수 내부에 선언된 x 변수는 이름은 같지만 스코프가 다릅니다.
자바스크립트 엔진은 스코프 체인(scope chain)을 따라 가장 가까운 스코프에서 먼저 식별자를 찾습니다.
- printLocalX() 함수 내부의 console.log(x)는 함수 내부에서 선언된 지역 변수 x를 출력하므로 "local"이 출력됩니다.
- 함수 호출이 끝난 후, 전역에서 console.log(x)를 실행하면 전역 변수를 참조하여 "global"이 출력됩니다.
이처럼 스코프는 자바스크립트 엔진이 식별자를 검색할 때 적용하는 규칙이며, 가까운(내부) 스코프에서 먼저 찾고, 없으면 외부 스코프로 올라가는 방식으로 동작합니다.
렉시컬 환경과 실행 컨텍스트
스코프를 이해하려면 코드의 문맥을 알아야 합니다. 코드의 문맥은 렉시컬 환경(lexical environment)으로 이뤄집니다. 렉시컬 환경이란 코드가 어디서 실행되며, 주변에 어떤 코드가 있는지를 의미합니다. 이를 구현한 것이 바로 실행 컨텍스트(execution context)이며, 모든 코드는 실행 컨텍스트에 의해 평가되고 실행됩니다.
중첩 스코프
코드 블록이나 함수는 중첩될 수 있으므로, 스코프도 중첩될 수 있습니다.
이를 중첩 스코프(nested scope)라 부릅니다.
var outer = 1; // 코드의 가장 바깥 영역에서 선언한 변수
if (true) {
var middle = 2; // 첫 번째 중첩 블록에서 선언한 변수
if (true) {
var inner = 3; // 두 번째 중첩 블록에서 선언한 변수
}
}
function outerFunction() {
var outerVar = 4; // 외부 함수 내에서 선언한 변수
function innerFunction() {
var innerVar = 5; // 내부 함수 내에서 선언한 변수
}
}
자바스크립트에서는 코드 블록이나 함수가 다른 블록이나 함수 안에 중첩될 수 있기 때문에, 스코프 또한 계층적으로 중첩됩니다.
위 예제에서 outer, middle, inner는 모두 var 키워드로 선언된 전역 또는 블록 내부 변수이며, var는 함수 스코프를 가지기 때문에 모두 전역 스코프에서 접근이 가능합니다. 반면 outerVar와 innerVar는 각각 outerFunction과 innerFunction이라는 함수 스코프 내부에서만 유효한 지역 변수입니다.
따라서, outer, middle, inner는 함수 밖에서는 접근 가능,outerVar는 outerFunction 안에서만, innerVar는 innerFunction 안에서만 접근 가능합니다.
이처럼 스코프는 코드 구조에 따라 트리 형태의 계층 구조를 이루며, 내부 스코프에서는 외부 스코프의 변수에 접근할 수 있지만, 그 반대는 불가능합니다.
→ 이를 통해 변수의 유효 범위를 제어하고 충돌을 방지할 수 있습니다.
변수 중복 선언
var 키워드로 선언된 변수는 같은 스코프 내에서 중복 선언이 허용되지만, 이는 의도치 않게 변수의 값이 재할당되어 변경되는 부작용을 발생시킵니다.
function duplicateVarExample() {
var x = 1;
var x = 2;
console.log(x); // 2
}
duplicateVarExample();
위 예제에서 변수 x는 두 번 선언되었지만 에러 없이 실행되며, 마지막에 할당된 값인 2가 출력됩니다. 이런 특성은 디버깅을 어렵게 만들고 버그의 원인이 될 수 있습니다.
반면, let과 const 키워드는 같은 스코프 내에서 중복 선언을 허용하지 않기 때문에, 보다 안전한 코딩을 가능하게 합니다.
function duplicateLetConstExample() {
let y = 1;
// let y = 2; // SyntaxError: Identifier 'y' has already been declared
console.log(y);
}
duplicateLetConstExample();
위처럼 let이나 const로 선언한 변수를 같은 스코프 내에서 다시 선언하려 하면, SyntaxError가 발생합니다.
이를 통해 의도하지 않은 변수의 재정의나 값 변경을 방지할 수 있고, 코드의 안정성과 예측 가능성이 높아집니다.
Q. 그래서 var, let, const가 무엇인가요?
var let const 구분
특징 | var | let | const |
재선언 | 가능 | 불가능 | 불가능 |
재할당 | 가능 | 가능 | 불가능 |
스코프 | 함수 스코프 | 블록 스코프 | 블록 스코프 |
호이스팅 | 변수 선언 및 초기화가 끌어올려짐 | 변수 선언만 호이스팅, 초기화는 X | 변수 선언만 호이스팅, 초기화는 X |
사용 추천 | X (예측 불가능한 오류 유발 가능성) | O 현대 JS에서 표준적으로 사용됨 | O 상수 또는 불변 참조일 때 사용 |
비교
var
- 함수 내부에서 선언 시 함수 스코프를 갖고, 블록 내에서 선언해도 블록 밖에서 접근이 가능합니다.
- 선언과 초기화가 모두 호이스팅되어 예기치 않은 동작 가능성 있습니다.
- ES6 이전에 사용되던 방식이며, 현재는 가급적 사용하지 않습니다.
let
- 블록 스코프를 가지므로 {} 내부에서만 유효합니다.
- 재선언은 불가능하지만 재할당은 가능합니다.
- 선언만 호이스팅되고 초기화는 호이스팅되지 않습니다. → 초기화 전에 접근하면 ReferenceError가 발생합니다.
const
- let과 동일한 블록 스코프를 가집니다.
- 선언 시 반드시 초기화가 필요하고, 재할당은 불가능합니다.
- 객체나 배열을 참조하는 경우 내부 값은 변경 가능 (불변은 아님, 참조 값이 고정된다는 의미입니다!)
스코프의 종류
스코프는 식별자가 선언된 위치와 유효 범위를 의미하므로, 모든 식별자는 자신이 선언된 스코프를 기준으로 유효 범위가 결정됩니다. 스코프는 변수 충돌을 방지하고, 각 변수의 생명 주기를 지정하는 중요한 기능입니다.
전역 스코프 | 코드 어디서든 참조할 수 있는 변수 |
지역 스코프 | 함수 코드 블록이 만든 스코프로, 함수 자신과 하위 함수에서만 참조 가능 |
함수 스코프 | var로 선언된 변수는 함수 전체에서 참조 가능. function 내부에서만 유효 |
블록 스코프 | 모든 코드 블록(함수, if문, for문, while문, try/catch문 등)이 만든 스코프로, 코드 블록 내부에서만 참조 가능 |
코드 - 전역 vs 지역
코드는 전역(global)과 지역(local)으로 구분할 수 있습니다. 이때 변수는 자신이 선언된 위치에 의해 자신이 유효한 범위인 스코프가 결정됩니다.
구분 | 설명 | 스코프 | 변수 |
전역 | 코드의 가장 바깥쪽 영역 | 전역 | 전역 |
지역 | 함수 몸체 내부 | 지역 | 지역 |
구분 | 생명 주기 | 유효 범위 |
전역 변수 | 애플리케이션 시작 ~ 종료 | 코드 어디에서든 참조 가능 |
지역 변수 | 함수 실행 시작 ~ 종료 | 함수 내부에서만 참조 가능 |
※ ES6 이후 let과 const는 블록(if, for 등) 안에서도 지역 스코프를 형성할 수 있습니다.
전역에서 선언된 변수는 전역 스코프를 갖는 전역 변수가 되고,
지역에서 선언된 변수는 지역 스코프를 갖는 지역 변수가 됩니다.
전역과 전역 스코프
var globalVar = "전역 변수";
function exampleFunction() {
console.log(globalVar); // "전역 변수" 출력
}
exampleFunction();
console.log(globalVar); // "전역 변수" 출력
전역은 코드의 가장 바깥 영역을 말합니다. 전역은 전역 스코프를 만들며, 이 영역에서 선언된 변수는 전역 스코프를 갖는 전역 변수가 됩니다. 전역 변수의 특징은 어디서든지 참조할 수 있다는 점입니다. 다시 말해, 전역 변수는 어디서든 참조가 가능하므로 함수 내부를 포함한 어느 곳에서든 접근할 수 있습니다.
전역 변수의 생명 주기는 애플리케이션의 생명 주기와 같습니다. 즉, 애플리케이션이 시작할 때 전역 변수가 생성되고, 애플리케이션이 종료할 때 전역 변수도 함께 소멸합니다.
지역과 지역 스코프
함수가 호출되어 실행될 때 지역 변수가 생성되고, 함수의 실행이 종료하면 지역 변수도 소멸한다.
지역 변수의 생명 주기 = 함수의 생명 주기
지역은 함수 몸체 내부를 말하며, 지역 스코프를 만듭니다. 이 영역에서 선언된 변수는 지역 스코프를 갖는 지역 변수가 됩니다. 지역 변수의 유효 범위는 자신의 지역 스코프와 하위 지역 스코프입니다. 즉, 지역 변수는 자신이 선언된 지역과 그 하위 지역에서만 참조할 수 있습니다.
다음 예제를 살펴봅시다.
var x = 'global x';
var y = 'global y';
function outer() {
var z = "outer's local z";
console.log(x); // global x
console.log(y); // global y
console.log(z); // outer's local z
function inner() {
var x = "inner's local x";
console.log(x); // inner's local x
console.log(y); // global y
console.log(z); // outer's local z
}
inner();
}
outer();
console.log(x); // global x
console.log(z); // ReferenceError: z is not defined
위 예제에서 inner 함수 내부에는 x 변수와 이름이 같은 전역 변수 x가 존재합니다. 이때 inner 함수 내부에서 x 변수를 참조하면, 전역 변수 x가 아니라 inner 함수 내부에서 선언된 지역 변수 x를 참조합니다. 이는 자바스크립트 엔진이 스코프 체인을 통해 참조할 변수를 검색했기 때문입니다.
스코프 체인은 스코프가 계층적으로 연결된 것을 말합니다. 변수를 참조할 때 자바스크립트 엔진은 스코프 체인을 통해 변수를 참조하는 코드의 스코프에서 시작하여 상위 스코프 방향으로 이동하며 선언된 변수를 검색합니다.
자바스크립트 엔진은 코드를 실행하기 위해 먼저 코드를 실행 컨텍스트에 편입하여 변수 선언을 포함한 모든 선언문을 먼저 실행한 다음, 순차적으로 실행합니다. 즉, 자바스크립트 엔진은 변수 선언이 있으면 변수 이름과 변수 값을 실행 컨텍스트가 관리하는 스코프(렉시컬 환경)에 등록하여 변수의 존재를 관리합니다. 변수 접근 시에는 스코프 체인을 통해 선언된 변수를 찾아 변수 값을 반환합니다.
이와 같이 자바스크립트 엔진이 스코프를 통해 어떤 변수를 참조해야 할 것인지 결정하는 것을 식별자 결정이라 하며, 이 과정에서 사용되는 규칙이 스코프 규칙입니다.
스코프 체인 (scope chain)
함수는 중첩될 수 있습니다. 함수 몸체 내부에서 함수가 정의된 것을 함수의 중첩이라고 하며, 함수 몸체 내부에서 정의한 함수를 중첩 함수, 중첩 함수를 포함하는 함수를 외부 함수라고 합니다.
함수는 중첩될 수 있으므로 함수의 지역 스코프도 중첩될 수 있습니다. 이는 스코프가 함수의 중첩에 의해 계층적 구조를 갖는다는 것을 의미 합니다. 중첩 함수의 지역 스코프는 중첩 함수를 포함하는 외부 함수의 지역 스코프와 계층적 구조를 갖는다. 이때 외부 함수의 지역 스코프를 중첩 함수의 상위 스코프라 합니다.
이렇게 스코프는 하나의 계층적 구조로 연결되며, 모든 지역 스코프의 최상위 스코프는 전역 스코프입니다. 이렇게 스코프가 계층적으로 연결된 것을 스코프 체인이라 합니다.
스코프 체인은 물리적인 실체로 존재합니다. 자바스크립트 엔진은 코드를 실행하기 앞서 위 그림과 유사한 자료구조인 렉시컬 환경(Lexical Environment)을 생성합니다. 변수 선언이 실행되면 변수 식별자가 렉시컬 환경에 키(key)로 등록되고, 변수 할당이 일어나면 변수 식별자에 해당하는 값을 변경합니다. 변수의 검색도 이 렉시컬 환경에서 이루어집니다.
스코프 체인은 실행 컨텍스트의 렉시컬 환경을 단방향으로 연결한 것입니다. 전역 렉시컬 환경은 코드가 로드되면 곧바로 생성되고 함수의 렉시컬 환경은 함수가 호출되면 곧바로 생성됩니다.
스코프 체인에 의한 변수 검색
var x = 'global';
function outer() {
var y = 'outer';
function inner() {
var z = 'inner';
console.log(x, y, z); // 'global', 'outer', 'inner'
}
inner();
console.log(x, y); // 'global', 'outer'
// console.log(z); // ReferenceError
}
outer();
console.log(x); // 'global'
// console.log(y); // ReferenceError
자바스크립트 엔진은 스코프 체인을 따라 변수를 참조하는 코드의 스코프에서 시작해서 상위 스코프 방향으로 이동하며 선언된 변수를 검색합니다. 절대 하위 스코프로 내려가며 검색하지는 않습니다.
이는 상위 스코프에서 유효한 변수는 하위 스코프에서 자유롭게 참조할 수 있지만 하위 스코프에서 유효한 변수를 상위 스코프에서 참조할 수 없다는 것을 의미합니다. 스코프의 계층적 구조는 부자 관계로 이루어진 상속(inheritance)과 유사합니다. 상속을 통해 부모의 자산을 자식이 자유롭게 사용할 수 있지만 자식의 자산을 부모가 사용할 순 없습니다.
스코프 체인에 의한 함수 검색
자바스크립트에서 함수는 변수처럼 식별자에 할당되며, 스코프를 가집니다. 즉, 함수도 일반 변수처럼 스코프 체인의 규칙을 따라 어디에 선언되었는지에 따라 접근 가능 범위가 달라집니다.
// 전역 함수
function showMessage() {
console.log('global function showMessage');
}
function executeBar() {
// 중첩 함수
function showMessage() {
console.log('local function showMessage');
}
showMessage(); // ①
}
executeBar();
위의 예제 코드에서 showMessage라는 함수가 전역과 executeBar 함수 내부에 각각 하나씩 존재합니다. ①의 showMessage() 호출은 전역 함수가 아닌, executeBar 내부에 정의된 지역 함수를 실행합니다. 그 이유는 자바스크립트 엔진이 식별자 showMessage를 해석할 때, 다음과 같은 과정을 따르기 때문입니다.
- 현재 실행 중인 실행 컨텍스트의 렉시컬 환경에서 showMessage 식별자를 찾습니다.
- 해당 환경에 존재하면 즉시 참조(= 호출)합니다.
- 없으면 스코프 체인을 따라 상위 스코프로 올라가며 찾습니다.
- 그래도 없으면 최종적으로 전역 스코프에서 검색합니다.
이러한 구조를 스코프 체인이라고 하며, "식별자를 검색하는 규칙"으로 이해할 수 있습니다..
스코프는 단순히 변수를 찾는 것이 아니라, 변수, 함수, 클래스 등 모든 식별자를 검색하는 기준이 됩니다.
중첩 함수와 계층적 스코프
자바스크립트에서는 함수 내부에 또 다른 함수를 정의할 수 있습니다. 이를 중첩 함수라고 하며, 포함하고 있는 함수는 외부 함수라고 합니다.
이런 중첩 구조로 인해 스코프도 계층적 구조를 가집니다.
- 하위 스코프(내부 함수)에서는 상위 스코프(외부 함수)의 변수나 함수를 자유롭게 참조할 수 있습니다.
- 반대로, 상위 스코프에서는 하위 스코프의 식별자를 참조할 수 없습니다.
즉, 모든 지역 스코프의 최상단에는 전역 스코프가 있으며,
자바스크립트 엔진은 현재 스코프 → 상위 스코프 → 전역 스코프 순으로 식별자를 검색하게 됩니다.
함수 레벨 스코프
자바스크립트에서 지역 스코프는 함수 몸체 내부에서만 생성됩니다. 즉, 변수나 함수가 함수 내부에서 선언될 때만 지역 스코프를 가지게 됩니다.
다른 대부분의 프로그래밍 언어는 블록 레벨 스코프(block level scope)를 따릅니다. 블록 레벨 스코프에서는 함수 몸체만이 아니라 모든 코드 블록(if, for, while, try/catch 등)이 지역 스코프를 만듭니다.
하지만 var 키워드로 선언된 변수는 오로지 함수의 코드 블록(함수 몸체)만을 지역 스코프로 인정하는데, 이러한 특성을 함수 레벨 스코프(function level scope)라 한다.
다음 예제를 봅시다.
var x = 1;
if (true) {
var x = 10;
}
console.log(x); // 10
위 예제에서 var 키워드로 선언된 변수 x는 전역 변수입니다. 함수 밖에서 var 키워드로 선언된 변수는 코드 블록 내에서 선언되었다 할지라도 함수 스코프만을 가지기 때문에 함수 바깥에서는 전역처럼 동작하게 됩니다. 따라서 if 문 내에서 var 키워드로 선언된 변수 x는 새로운 블록 스코프를 생성하지 않기 때문에, 바깥의 x와 같은 스코프(전역 스코프)에 존재하게 됩니다. 결과적으로 기존 전역 변수 x가 덮어써지며, 의도치 않은 값 변경이 발생할 수 있습니다.
for 문의 변수 선언문에서 var 키워드로 선언한 변수도 전역에서 선언된 변수처럼 작동하게 됩니다.
var i = 10;
for (var i = 0; i < 5; i++) {
console.log(i); // 0 1 2 3 4
}
console.log(i); // 5
이러한 var의 함수 레벨 스코프 한계를 극복하고, 보다 예측 가능한 범위 관리를 가능하게 하기 위해 ES6에서는 let과 const 키워드를 도입하였습니다. 이들은 모든 코드 블록(if, for, while 등)에서 스코프를 생성하는 블록 레벨 스코프(block-level scope)를 지원하여 코드의 안정성과 가독성을 높입니다.
*ES6 - 2015년에 도입된 자바스크립트의 6번째 표준안. 코드가 간결해지고 생산성이 향상됨.
렉시컬 스코프
Q. 함수를 어디서 정의했나요?
자바스크립트는 렉시컬 스코프(lexical scope) 혹은 정적 스코프(static scope)라고 불리는 방식을 따릅니다. 이는 함수를 어디서 호출했는지가 아니라 함수를 어디서 정의했는지에 따라 상위 스코프를 결정한다는 것을 의미합니다.
반면 함수를 어디서 호출했는지에 따라 함수의 상위 스코프를 결정하는 방식도 있는데요. 바로 동적 스코프(dynamic scope)입니다!
다음 예제를 볼까요?
var x = 1;
if (true) {
var x = 10;
}
console.log(x); // 10
위 예제에서 var 함수의 상위 스코프는 무엇일까요? 이는 var 함수를 어디서 정의했는지에 따라 결정됩니다. 자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 호출했는지는 스코프 결정에 아무런 영향을 주지 않습니다.
위 예제에서 var 함수는 전역에서 정의되었습니다. 따라서 var 함수의 상위 스코프는 전역 스코프이며, 위 예제는 전역 변수 x의 값인 1을 두 번 출력합니다.
만약 자바스크립트가 동적 스코프를 따른다면 foo 함수 내부에서 호출된 var 함수의 상위 스코프는 foo 함수의 스코프가 될 것입니다. 하지만 자바스크립트는 렉시컬 스코프를 따르므로 함수를 어디서 정의했는지에 따라 상위 스코프가 정적으로 결정됩니다.
함수 정의가 실행되어 생성된 함수 객체는 이렇게 결정된 상위 스코프를 기억합니다. 함수가 호출될 때마다 함수의 상위 스코프를 참조할 필요가 있기 때문입니다. 이를 실현하기 위해 자바스크립트 엔진은 렉시컬 환경(Lexical Environment)이라는 자료구조를 사용합니다.
지역은 함수 몸체 내부를 말하며, 지역은 지역 스코프를 만든다고 합니다. 이는 함수에 의해서만 지역 스코프가 생성됨을 의미합니다. 대부분의 프로그래밍 언어는 블록 레벨 스코프를 따르지만, 자바스크립트의 var 키워드는 함수 레벨 스코프만을 지원합니다.
var 키워드로 선언한 변수는 함수 몸체 외부에서 선언되었다 할지라도 모두 전역 변수가 되어 의도치 않은 변수 값의 변경을 발생시킬 수 있습니다.
또한 자바스크립트는 렉시컬 스코프를 따릅니다. 함수의 상위 스코프는 함수 정의가 실행될 때 정적으로 결정됩니다. 함수 객체는 이렇게 결정된 상위 스코프를 기억하며 함수가 호출될 때마다 기억된 스코프 체인을 참조합니다.
마무리
스코프란 식별자가 유효한 범위를 의미하며, 이를 통해 변수 간 충돌을 방지하고 변수의 생명 주기를 제어할 수 있습니다. 자바스크립트는 렉시컬 스코프를 따르기 때문에, 함수의 정의 위치를 기준으로 스코프가 결정됩니다.
또한 var는 함수 레벨 스코프만 지원하는 반면, let과 const는 블록 레벨 스코프를 지원하여 보다 세밀한 범위 제어가 가능합니다.자바스크립트 엔진은 변수를 참조할 때 스코프 체인을 따라 현재 스코프에서 시작하여 상위 스코프로 차례차례 식별자를 탐색하게 됩니다.
이처럼 스코프의 개념을 제대로 이해하면, 자바스크립트의 내부 동작 방식은 물론 변수의 참조 흐름까지 더욱 명확하게 파악할 수 있습니다. 이 글이 자바스크립트의 스코프 개념을 이해하는 데 조금이나마 도움이 되었기를 바랍니다.
참고 자료
[JavaScript] Scope란? (스코프 체인, 실행 컨텍스트...)
🛒 Scope란? Scope는 직역하면 "범위"라는 뜻이다. JavaScript 에서 Scope(스코프)는 변수에 접근할 수 있는 범위를 말한다. 식별자(변수)를 찾기위한 규칙이라고도 한다. var x = 'global'; function foo () { var x
doozi0316.tistory.com
[Javascript]자바스크립트 스코프 완벽 가이드: 기초부터 고급까지
자바스크립트를 다루는 데 있어서 '스코프'는 매우 중요한 개념입니다. 스코프를 이해하면 코드의 가독성을 높이고, 버그를 줄이는 데 큰 도움이 됩니다. 이번 글에서는 자바스크립트 스코프에
creativevista.tistory.com
모던 자바스크립트 Deep Dive - 예스24
『모던 자바스크립트 Deep Dive』에서는 자바스크립트를 둘러싼 기본 개념을 정확하고 구체적으로 설명하고, 자바스크립트 코드의 동작 원리를 집요하게 파헤친다. 따라서 여러분이 작성한 코드
www.yes24.com
'2주차' 카테고리의 다른 글
협업과 정확성을 위한 주석 JSDoc (0) | 2025.04.23 |
---|---|
SPA (Single Page Application) (0) | 2025.04.21 |
useEffect는 왜 자꾸 실행될까? (0) | 2025.04.16 |
JavaScript 프론트엔드 면접 개념 정리 & 자주 나오는 질문 모음집 (0) | 2025.04.15 |
CSR vs SSR 정확히 집고 넘어가자 (0) | 2025.04.14 |