► Q1: greetSomeone() 과 firstName 실행 결과는?
let greeting = 'Hello';
function greetSomeone() {
let firstName = 'Josh';
return greeting + ' ' + firstName;
}
greetSomeone(); // hello Josh;
firstName; // firstName is not defined (ReferenceError)
► 변수 firstName에 접근할 수 있는 범위가 존재합니다.
let greeting = 'Hello'; //이 구간부터 Global Scope
function greetSomeone() { // 이 구간부터 } 까지 local Scope
let firstName = 'Josh';
return greeting + ' ' + 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
► 문제 1
콘솔에 출력되는 결과는?
for (let i = 0; i < 5; i++) {
console.log(i); // 다섯번 iteration
}
console.log(`final i: ${i}`);
정답 ) // Uncaught ReferenceError: i is not defined
// Block 범위를 벗어난 즉시 변수를 사용할 수 없기 때문입니다.
► var 키워드 vs let 키워드
► 문제
콘솔에 출력되는 결과는?
for (var i = 0; i < 5; i++) {
console.log(i); // 다섯번 iteration
}
console.log(`final i : ${i}`);
정답) 5 // var을 썼기 때문에 Block을 벗어나도 (같은 function scope)에서는 사용이 가능
► const 키워드
► 요약
► var를 사용한 재선언시, 아무런 에러도 내지 않습니다
let myName = 'Steve';
let myName = 'John';
//error 발생
var yourName = 'Tony';
var yourName = 'Tim';
//에러가 발생하지 않음
실제 코딩할 때에 재선언을 해야 할 필요가 있을까요?
보통 이 경우는 버그이며, let 키워드가 이러한 실수를 막아줍니다
► Rule 3 : 전역 변수와 window 객체
► Rule 4 : 선언 없이 초기화된 전역 변수
이 경우에 에러를 내주면 좋겠지만 에러가 나지 않습니다
function showAge() {
//age는 전역 변수로 취급됩니다
age = 90;
console.log(age);
}
showAge(); // 90
console.log(age); // 90
► 위와 같은 실수를 방지하고 싶을 경우, Strict Mode를 사용하세요
'use strict';
//use strict를 정의해준 후 같은 코드를 작성하면 RefenceError가 발생합니다
function showAge() {
//age는 전역 변수로 취급됩니다
age = 90; //❗️RefenceError
console.log(age);
}
showAge(); // 90
console.log(age); // 90
► 문제 1
정답 ) 3, 4
► 문제 2
정답) 1, 2, 3