함수 선언식과 표현식
함수 선언
function func_name(a){
document.write('Hi<br>');
return a+1;
}
var b = func_name(10);
document.write(b);
함수 표현식
var func_name = function(a){
document.write('Hi<br>');
return a+1;
}
var b = func_name(10);
document.write(b);
호이스팅이란? 변수가 감아 올려지는 것(?)
변수나 함수의 정의가 선언과 할당으로 분리되는 것을 의미한다. 변수가 함수 내부에서 정의되면 선언이 함수 최상위로 가고 함수 외부에서 정의된 경우 전역 범위 최상위로 가게 된다.
함수 변수는 함수가 아닌 변수로 인식하기 때문에 호이스팅이 되지 않는다.
아래의 함수 hello의 정의는
function hello(){
document.write(hi+'<br>');
var hi='안녕';
document.write(hi+'<br>');
}
hello();
function hello(){
var hi; //함수 내부에 정의된 변수 hi가 호이스트되어 함수 최상단에 위치한다.
document.write(hi+'<br>');//hi는 undefined
hi='안녕';//hi에 '안녕' 할당
document.write(hi+'<br>');//안녕 출력
}
hello();
호이스트되면 함수 선언은 변수 선언을 덮어쓴다.
var hello;
function hello(){
document.write('typeof(hello)+<br>');
}
hello();
변수 초기화가 되어있으면 함수 선언은 변수 선언을 덮어쓰지 못한다.
var hello="hello";
function hello(){
document.write('typeof(hello)+<br>');
}
log(typeof(hello));
hello();//hello는 함수가 아니라는 경고가 뜬다. 즉, hello는 변수로 남아있는 것이다.
아래는 호이스팅의 특성이 잘 드러난 예이다.
var a = 5;
function alrt(){
alert(a);
a=10;
alert(a);
}
alert();
결과는 어떻게 나올까? 전역 변수 a=5로 인해 5와 10이 출력될까?
아니다.. alrt() 함수 안에 있는 a변수가 맨 위로 올라가 초기화되지 않은 채 alert(a)를 하면 undefined가 나오고 그 후 a=10이 할당되었으므로 10이 출력된다.
즉 undefined, 10이 출력되는 것이다. 아래에 어떻게 해석되는지 살펴보자
var a=5;
function alrt(){
var a; //초기화되지 않음
alert(a); //undefined
var a=10; //변수를 10으로 초기화
alert(a); //10 출력
}
이제 보니 전에 왜 전역변수를 사용했음에도 값이 출력되지 않았는지 알겠다. 이래서 전역변수는 별로 권장하지 않는가보다.
'JS' 카테고리의 다른 글
setTimeout (0) | 2018.05.28 |
---|---|
Javascript 객체 (0) | 2018.05.02 |
Javascript 반복문 (0) | 2018.05.02 |
Javascript 조건문 (0) | 2018.05.02 |
Javascript 연산자 (0) | 2018.05.01 |