function a() {
console.log(arguments);
}
a(1, 2, 3); // { '0':1, '1':2, '2':3 }
function printName(firstname) {
var myname = "SW";
return myname + " " + firstname;
}
var test1 = function() { // (익명) 함수표현식
return '익명 함수표현식';
}
var test2 = function test2() { // 기명 함수표현식
return '기명 함수표현식';
}
function printName(firstname) { // 함수선언문
var result = inner(); // "선언 및 할당" - 함수선언문이 아래에 있어도 오류발생x
console.log(typeof inner); // > "function"
console.log("name is " + result); // > "name is inner value"
function inner() { // 함수선언문
return "inner value";
}
}
printName(); // 함수 호출
/* 오류 var */
function printName(firstname) { // 함수선언문
console.log(inner); // > "undefined": 선언은 되어 있지만 값이 할당되어있지 않은 경우
var result = inner(); // ERROR!! - inner 가 undefined로 function으로 인식되지 않았음
console.log("name is " + result);
var inner = function() { // 함수표현식
return "inner value";
}
}
printName(); // > TypeError: inner is not a function
/* 오류 const/let */
function printName(firstname) { // 함수선언문
console.log(inner); // ERROR!!
let result = inner();
console.log("name is " + result);
let inner = function() { // 함수표현식
return "inner value";
}
}
printName(); // > ReferenceError: inner is not defined
// let/const의 경우, 호이스팅이 일어나지 않기 때문에 위의 예시 그대로 이해하면 된다.
var myName = "Heee"; // 값 할당
var yourName; // 값 할당 X
function myName() { // 같은 이름의 함수 선언
console.log("myName Function");
}
function yourName() { // 같은 이름의 함수 선언
console.log("yourName Function");
}
console.log(typeof myName); // > "string"
console.log(typeof yourName); // > "function"
var, let, const 모두 호이스팅이 된다.
위의 3가지 모두 평가 시점에 LexicalEnvironment에 변수 정보를 수집한다(호이스팅 개념으로 알고있는 동작)
var
var는 선언 단계에서 선언된 변수에 접근이 가능하다
let, const
let, const는 선언 단계에서 변수 수집을 하지만 코드가 실행되기 전에는 접근이 불가능하다.
👉🏻 변수 수집이 끝나고 실행되기 전까지 접근이 불가능한 이 단계를 TDZ(Temporal Dead Zone)라고 한다
function test() {
debugger;
console.log('before ? ', {a, b, c});
const a = 1;
const b = 2;
const c = 3;
console.log('after ? ', {a, b, c});
}
test();//호이스팅 되었지만, 접근은 불가능하다.