BGM용 세이라디오
열기▼       고정
전체
글목록

JS 함수의 근본적인 정의와 구문

목요일, 8월 22, 2013
function declaration=statement와 expression=operator가 주로 쓰이는데, JS에서 비슷한 이 둘을 구별해야 하는 이유는 미묘한 차이를 이해하는 데에 중요하기 때문이다.

1. declaration은 변수를 var로 정의하는 것과 거의 같다. 또한 끝에 세미콜론을 붙이지 않는다.
function f(){} //f라는 함수 정의
function(){} //이름없는 함수 정의(거의 쓰이는 일 없음)
실행할 땐 f();라고 쓴다. f;와 같이 괄호를 빼먹으면 안된다.
var v=f();
v();
위와 같이 변수에 할당할 수도 있다.

2. expression은 함수를 명령어 묶음처럼 취급하는 경우이다. 식에서 쓰인다.
var a=function(){명령어}; //a에 명령어 할당
var b=function f(){명령어}; //위의 기능에 더불어 명령어에 f라는 이름을 붙여 다시 호출할 수 있게 해준다. b();와 f();는 같은 결과를 낸다.
(function(){})();
위 구문은 expression으로 해석될 수 있다. 하지만다소 관용적, 즉 유연성이 적다. function이 두개거나 function(){} 외부에 명령어가 있으면 실행되지 않는다.

인수(argument)와 매개변수(parameter) 표기방법을 따져보면 더 깊은 통찰력을 가질 수 있다.
var b_p="global";
function a(a_p){
var a_v="v";
a_p(a_v); //"v" 알림
alert(b_p); //"global" 알림
}
a(function b(b_p){alert(b_p);});
위의 예시에서 b 함수는 a 함수에 보내는 인수로, expression이므로 정의됨과 동시에 인수로 보내진다.
이때 b_p는 b함수 고유의 매개변수로 함수 내에서만 참조할 수 있다. 따라서 b_p는 global scope도 아니고 a함수에서도 참조할 수 없다. 따라서 a함수에서는 존재하는 b_p중 참조할 수 있는 "global"을 이용한다.

참고로 {}('curved bracket')괄호는 함수 몸체를 나타내기도 하지만 JS에서 Object를 정의할 때에도 쓰인다.
예시:
var a={"sub1":"im subobject1"};
alert(a.sub1); //"im subobject1"
첫 댓글을 써주세요!

댓글을 인용하려면 @![댓글 ID]!@와 같이 쓰시면 됩니다. "@!" 와 "!@"를 쓰시려면 "+@+!+", "+!+@+"와 같이 써주세요.

페이스북 댓글
.post-outer{ -webkit-transform:none; transform:none; display:inline; padding:0; margin:0; border-width:0; } .hentry>div{ display:none; }