
전역 스코프 (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/