전역 스코프 (Global scope)
전역: 코드의 가장 바깥 영역
지역 스코프 (Local scope / Function-level scope)
지역: 함수 몸체 내부
var a = 1;
function foo () {
var b = 2;
console.log(a);
console.log(b);
}
foo();
console.log(b); // 'b'에 접근할 수 없다.
a
를 불러오는 경우a
라는 변수를 찾음a
가 없어 외부에서 변수 a
를 찾아 불러옴b
는 본인이 속한 함수내에서만 접근가능하도록 범위가 정해짐.식별자 결정: 어떠한 변수를 참조할 것인지 결정하는 과정
Scope는 함수를 호출할 때가 아니라 선언할 때 생긴다.
var
의 경우, 내부/ 외부를 판별하는 기준은 함수var
키워드로 선언된 변수는 함수 레벨 스코프를 따름
함수 레벨 스코프 (Function-level scope)
- 함수 내에서 선언된 지역 변수는 함수 내에서만 유효
- 함수 외부에서는 참조 불가
let
,const
키워드로 선언된 변수는 블록 레벨 스코프를 따름
블록 레벨 스코프 (Block-level scope)
- 코드 블록 내에서 선언된 변수는 코드 블록 내에서만 유효, 코드 블록 외부에서는 참조 불가
- 코드 블록 내부에서 선언한 변수는 지역 변수
var
키워드로 선언한 전역 변수는 전역 객체(Global Object)if (true) {
var x = 5;
}
console.log(x); // 5;
x
는 전역 변수var x = 1;
if (true) {
// x는 전역 변수, 이미 선언된 전역 변수 x가 있어 x 변수는 중복 선언
var x = 10;
}
console.log(x); // 10
var
키워드로 선언한 변수는 함수의 코드 블록만을 지역 스코프로 인정var
키워드로 선언한 변수는 코드 블록 내에서 선언해도 모두 전역변수가 됨var i = 10;
// var 키워드로 for 문에서 선언한 변수 i는 전역변수
// 이미 선언한 전역 변수 i가 있으므로 중복 선언
for(var i = 0; i < 5; i++) {
console.log(i) // 0 1 2 3 4 5
}
// 의도치 않게 변수와 값이 변경
console.log(i) // 5
for
문의 변수 선언문에서 var
키워드로 선언한 변수도 전역 변수가 됨var x = 'global';
function foo() {
var x = 'local';
console.log(x);
}
foo(); // local
console.log(x); // global
x
와 지역변수 x
가 중복 선언var x = 'global';
function foo() {
var x = 'local';
console.log(x); // local
function bar() { // 내부함수
console.log(x); // local
}
bar();
}
foo();
console.log(x); // global
bar
에서 참조하는 변수 x
는 함수 foo
에서 선언된 지역변수x
가 뒤로 밀림스코프 체인: 스코프가 계층적으로 연결된 것
var x = 10;
function foo() {
x = 100;
console.log(x); // 100
}
foo();
console.log(x); // 100
var x = 10;
function foo() {
var x = 100;
console.log(x); // 100
function bar() {
x = 1000;
console.log(x); // 1000
}
bar();
}
foo();
console.log(x); // 10
var foo = function () {
var a = 3;
var b = 5;
console.log(a, b); // a:3, b:5
var bar = function (){
var b = 7;
var c = 11;
console.log(a, b, c); // a:3, b:7, c:11
a += b + c;
console.log(a, b, c); // a:21, b:7, c:11
};
bar();
};
foo();
함수를 어디에 선언하였는지에 따라 결정되는 환경
var x = 1;
function foo() {
var x = 10;
bar();
}
function bar() {
console.log(x);
}
foo(); // 1
bar(); // 1
bar
는 전역에 선언bar
의 상위 스코프는 전역 스코프x
의 값 1을 두번 출력bar
의 상위 스코프를 결정하는 경우 (동적 스코프)bar
의 상위 스코프: 함수 foo
와 전역bar
의 상위 스코프를 결정하는 경우(렉시컬 스코프 || 정적 스코프)bar
의 스코프: 전역function foo() {
x = 10;
}
foo();
console.log(x); // 10
함수 foo
내에 선언되지 않은 변수 x
에 값 10을 할당
변수 x
의 참조를 찾아야 변수 x
에 값을 할당할 수 있음
→ 자바스크립트 엔진이 스코프 체인에서 변수 x
를 검색하기 시작
foo
함수의 스코프에서 변수 x
를 검색
foo
함수의 스코프에는 변수 x
에 대한 변수 선언이 없으므로 검색에 실패foo
함수의 상위 컨텍스트(위 예제의 경우 전역 스코프)에서 변수 x
를 검색전역 스코프에도 변수 x
가 존재하지 않기 때문에 ReferenceError를 발생시킬 것 같지만 __전역 변수x
를 암묵적으로 생성하고 값을 할당
var
키워드를 생략한 변수는 암묵적으로 전역 변수
→ 이러한 변수를 암묵적 전역 변수(implicit global)라 함
개발자의 의도와는 상관없이 동작하는 암묵적 전역 변수는 오류의 발생 원인이 될 가능성이 크기 때문에 변수를 선언할 때는 반드시
let
키워드를 사용
// x.js
function foo() {
// var i = 0;
i = 0;
// ...
}
// y.js
for (var i = 0; i < 5; i++) {
foo();
console.log(i);
}
x.js
와 y.js
에 모두 의도하지 않은 변수 i
가 존재
HTML에서 이 2개의 자바스크립트 파일을 로드하면 변수 i
는 중복됨
x.js
의 변수 i
는 var
키워드를 사용하지 않았으므로 암묵적으로 전역 변수화
y.js
의 변수 i
는 전역변수
자바스크립트는 변수명의 중복을 허용
→ 어떠한 에러 메시지도 발생시키지 않음
→ 무한 반복상태에 빠지게 됨.
전역변수의 무분별한 사용은 위험하다. 전역변수를 반드시 사용하여야 할 이유를 찾지 못한다면 지역변수를 사용하여야 하며 변수의 범위인 스코프는 좁을수록 좋다.
var MYAPP = {};
MYAPP.student = {
name: 'Lee',
gender: 'male'
};
console.log(MYAPP.student.name);
(function () {
var MYAPP = {};
MYAPP.student = {
name: 'Lee',
gender: 'male'
};
console.log(MYAPP.student.name);
}());
console.log(MYAPP.student.name);
Very good, I think I found the knowledge I needed. I will see and refer to some information in your post. thank you!
https://surgery-costs.com/nose-surgery-cost-in-nepal/