WEB/Javascript
Hoisting/함수선언식과 표현식에서의 차이
seo-0
2019. 10. 2. 12:00
* 자바스크립트의 호이스팅(Hoisting)
function getX(){
console.log(x); //undefined
var x = 100;
console.log(x); //100
}
getX();
hoist : 끌어올리기 - 자바스크립트에서 끌어올려지는 것은 변수
- 호이스트 란, 변수의 정의가 범위에 따라 선언 과 할당으로 분리되는 것을 의미한다.
// 작동 순서
function getX(){
var x; //undefined
console.log(x);
x = 100; // 100
console.log(x);
}
getX();
'선언문'은 자바스크립트 엔진 구동시, 가장 최우선으로 해석하고,
'할당 구문'은 런타임 과정에서 이루어지기 때문에, 호이스팅 되지 않는다.
- 함수 선언이 함수 실행 부분보다 뒤에 있어도, 자바스크립트 엔진이 함수 선언 을 끌어올린다.
( 호이스팅은 변수를 끌어올리지만, 함수이던, 변수값이던 할당되기 전이므로 undefined 가 할당된다. )
* 함수 선언식 / 함수 표현식
function test(){
var inner = function(){
return "inner value";
} //함수 표현식 - 변수에 함수 표현식을 담아놓는 것
var result = inner();
console.log("name is " +result);
}
test(); // name is inner value
먼저 정의된 함수 표현식을 아래 변수에서 사용 가능
function test(){
var result = inner();
// js 파서가 전체 훑어서 아래에 있는 함수 기억 -> 실행
console.log("name is "+result);
function inner(){
return "inner value";
}
}
test(); // name is inner value
function test(){
var result = inner();
console.log("name is " +result);
var inner = function(){
return "inner value";
}
}
test(); //TypeError : inner is not a funtion
두 코드의 차이점 - 함수inner 의 정의 부분
- 1) function inner() 형태로 함수 선언문
- 2) var inner = function() 형태로 함수 표현식, 함수를 변수에 대입
: 변수 자체에 할당된 값(여기서는 함수) 은 호이스팅 불가능
// (2) 의 작동순서
function test(){
var inner; // 호이스팅
var result = inner();
console.log("name is " +result);
inner = function(){
return "inner value";
}
}
test(); //TypeError : inner is not a funtion