► Q1: greetSomeone() 과 firstName 실행 결과는?

let greeting = 'Hello';
function greetSomeone() {
	let firstName = 'Josh';
	return greeting + ' ' + firstName;
}
greetSomeone(); // hello Josh;
firstName; // firstName is not defined (ReferenceError)

► 변수 firstName에 접근할 수 있는 범위가 존재합니다.


► Scope : 변수 접근 규칙에 따른 유효 범위


► Rule 1 : Local Scope vs Global Scope

let greeting = 'Hello'; //이 구간부터 Global Scope
function greetSomeone() { // 이 구간부터 } 까지 local Scope
	let firstName = 'Josh';
	return greeting + ' ' + firstName;
}

► 문제 1

let name = "Richard";

function showName() {
  let name = "Jack"; // 지역 변수
  // showName 함수 안에서만 접근 가능
  console.log(name); // ???
}

console.log(name); // ???
showName();
console.log(name); // ???

위 코드에서 순서대로 콘솔에 출력되는 결과는?

1. Richard / Jack / Jack

2. Richard / Jack / Richard

3. Jack / Richard / Richard

4. Jack / Jack / Jack

정답 ) 2번

► 문제 2

let name = "Richard";

function showName() {
  name = "Jack"; // 전역 변수
  // 선언(let)이 없기 때문에, 바깥 scope에 있는 name이라는 변수를 가져옵니다
  console.log(name); // ???
}

console.log(name); // ???
showName();
console.log(name); // ???

위 코드에서 순서대로 콘솔에 출력되는 결과는?

1번 Richard / Jack / Jack

2번 Richard / Jack / Richard

3번 Jack / Richard / Richard

4번 Jack / Jack / Jack

정답) 1번

► Rule 2 : Function Scope vs Block Scope

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/babcf992-1fda-4457-83ee-d60815cd8ae5/_2020-09-18__12.47.39.png


► 문제 1

콘솔에 출력되는 결과는?

for (let i = 0; i < 5; i++) {
	console.log(i); // 다섯번 iteration
}
console.log(`final i: ${i}`);

정답 ) // Uncaught ReferenceError: i is not defined
      // Block 범위를 벗어난 즉시 변수를 사용할 수 없기 때문입니다.