본문 바로가기

Programing/JavaScript

[JavaScript] Scope

1
2
3
4
5
6
7
8
var greeting = 'Hello';
function greetSomeone() {
    var firstName = 'Josh'
    return greeting + ' ' + firstName;
}
 
greetSomeone();  // => 'Hello Josh'
firstName;  // ReferenceError
cs


function greetSomeone() 범위는 => Local Scope

var greeting부터 firstName까지 => Global Scope


안쪽(Local Scope)에서는 바깥(Global Scope) 값을 가져올 수 있는데

바깥쪽에서는 안쪽 값을 가져올 수 없다




(6:40)

What is a scope?

변수는 어떠한 환경 내에서만 사용 가능하며, 프로그래밍 언어는 각각의 변수 접근 규칙을 갖고 있다


· 변수와 그 값이 어디서부터 어디까지가 유효한지를 판단하는 범위

· 즉, Scope는 변수 접근 규칙에 따른 유효 범위를 의미

· JavaScript에서는 함수가 선언되는(Lexical) 동시에 자신만의 Scope를 가짐




Lexical(static) scope vs. Dynamic scope

· Lexical(static) Scope: 유효범위가 코드를 작성될 때 결정됨

· Dynamic Scope: 유효범위가 실행 순서에 의해 결정됨




(8:30)

Rule 1: Local Scope vs. Global Scope

· Scope는 중첩이 가능

· 하위 Scope가 상위 Scope의 변수 접근 가능

· Global Scope는 어디에서도 접근 가능

· 지역변수는 함수 내에서 전역변수보다 높은 우선순위


1
2
3
4
5
var global = '전역변수'
 
function foo() {
    var local = '지역변수'
}
cs


1
2
3
4
5
6
7
8
var hero = 'spiderman'
 
function foo() {
    var hero = 'ironman';
    console.log(hero);
}
 
foo(); // => ironman (안쪽 변수가 바깥쪽보다 우선순위를 가진다)
cs


(6:30)


Rule 2: block level vs. function level

· JavaScript는 기본적으로, function level의 scoping 규칙을 따름


1
2
3
4
5
6
7
8
9
10
11
var name = "Richard";
 
function showName() {
  var name = "Jack"// 지역 변수
  // showName 함수 안에서만 접근 가능
  console.log(name); // 'Jack'
}
 
console.log(name); // 'Richard'
showName(); // 'Jack'
console.log(name); // 'Richard'
cs


1
2
3
4
5
6
7
8
9
var name = "Richard";
// 아래의 if문은 name변수에 대한
// local scope를 생성하지 않는다. ★
if (name) {
  name = "Jack";
  console.log(name); // 'Jack'
}
// if문에서 변경된 name은 여전히 전역 변수!!
console.log(name); // 'Jack'
cs


1
2
3
4
for(var i=0; i<5; i++) {
  console.log(i); // 다섯번 iteration
}
console.log('final i:', i); // i = 5
cs




function level을 따르지 않는 변수 선언

· let, const keyword (ES6 기능)


1
2
3
4
for(let i=0; i<5; i++) {
  console.log(i); // 다섯번 iteration
}
console.log('final i:', i); // ReferenceError
cs


· let과 const keyword는 block을 벗어나면, 접근 불가능

· let과 const는 var로 정의된 변수를 재정의할 수 없음

· const는 불변(immutable)한 값으로, 다시 값을 할당할 수 없음




Rule 3: 전역 변수와 window 객체

· 함수의 외부에서 선언된 모든 변수는 전역 범위

· 전역 범위를 대표하는 객체: window

· 모든 전역 변수는 window객체와 연결


1
2
var name = "Paul";
console.log(window.name); // Paul
cs




Rule 4: 선언 없이 초기화된 변수는 전역 변수! (주의)

1
2
3
4
5
6
7
8
function showAge() {
  // age는 전역 변수.
  age = 90;
  console.log(age);
}
showAge(); // 90
console.log(age); // 90 (age가 전역변수로 되버렸기 때문에 바깥에서 출력가능)
 
cs


warning!

· 버그를 줄이기 위해 선언 없이 변수를 초기화 하지마세요

· 가급적 전역 범위에 변수를 생성하지 마세요




Rule 5: Hoisting

· 변수 선언은 범위에 따라 선언과 할당으로 분리됨

· JavaScript 엔진이 내부적으로 변수 선언을 scope의 상단으로 끌어올림(hoist)


Quiz


1
2
3
= 2;
var a;
console.log(a); // ??
cs


답 :

실제 코드


1
2
3
= 2;
var a;
console.log(a); // 2
cs


JavaScript 엔진


1
2
3
var a; // (hoising되어 끌어올려짐)
= 2;
console.log(a); // 2
cs




Hoisting: 선언과 할당의 분리

실제 코드


1
var a = 2;
cs


JavaScript 엔진


1
2
var a;
= 2;
cs


Quiz


1
2
console.log(a); // ??
var a = 2;
cs


실제 코드


1
2
console.log(a); // undefined
var a = 2;
cs


JavaScript 엔진


1
2
3
var a;
console.log(a); // undefined
= 2;
cs




Hoisting: Scope의 상단으로 끌어올림

실제 코드


1
2
3
4
function showName() {
  console.log("First name : " + name);
  var name = "Ford";
}
cs


JavaScript 엔진


1
2
3
4
5
function showName() {
  var name;
  console.log("First name : " + name);
  name = "Ford";
}
cs




Hosting: 함수

· 함수 선언식은 항상 상단으로

· 함수 표현식은 할당된 변수만 상단으로 Hosting



함수 선언식


1
2
3
4
5
show(); // 이 경우에는 잘 작동함 함수선언식이라 함수가 통째로 호이스팅되었기 때문
 
function show() {
  console.log('displayed!');
}
cs


함수 표현식


1
2
3
4
5
show(); // TypeError: show is not a function
// 지금 show는 var show;의 상태 변수만 선언한 상태이다.
var show = function() {
  console.log('displayed!');
}
cs


ReferenceError: 보통 undefined된 변수에 접근할 때 발생

TypeError: 보통 함수가 아닌 것을 실행하려 할 때 발생


실제 코드


1
2
3
4
5
show(); // ?
 
var show = function() {
  console.log('displayed!');
}
cs


JavaScript 엔진


1
2
3
4
5
6
var show;
show(); // TypeError (undefined 값 호출)
 
show = function() {
  console.log('displayed!');
}
cs





'Programing > JavaScript' 카테고리의 다른 글

[JavaScript] this / call, apply 호출  (0) 2019.02.14
[JavaScript] Closure  (0) 2019.02.13
[JavaScript] for문, forEach(), for in, for of 차이  (0) 2019.02.12
[JavaScript] Window.prompt()  (0) 2019.02.12
[JavaScript] eval()  (0) 2019.02.12