IT/JavaScript
function(){} ();에서 ();의 의미
트래이닝맨
2012. 8. 10. 10:02
728x90
반응형
0.정의
()가 없냐 있느냐에 따라 호출하는 방식과 그것이 의미하는 것이 달라진다.
일단 ()의 의미를 간단하게 실행이라고 생각하고 아래의 예제를 보자.
Source var serial_maker = function(){ var prefix=' '; var seq=0; return{ set_prefix:function(p){ prefix = String(p); }, set_seq:function(s){ seq = s; }, gensym:function(){ var result = prefix +seq; seq +=1; console.log(">>" + result); return result; } }; }; |
호출방법 var seqer = serial_maker(); seqer.set_prefix('Q'); seqer.set_seq(1000); serial_maker().gensym(); |
의미 Source를 보면 function이 끝나는 부분에 ()가 없다. 그 의미는 "function을 정의만 한다." 이다. 그래서 호출하는 방법을 보면 "serial_maker().gensym()" 으로 " 일단 serial_maker function을 한번 실행하고 function list를 리턴받고 다시 한번 리턴 받은 function중 하나인 gensym을 실행한다." 를 의미한다. 이것을 좀 더 의미 있게 해석을 하자면 이렇다. function을 위와 같이 정의하고 실행을 하게 되면 매번 새로운 object가 생기게 되고 매번 변수의 값이 initial값으로 리셋된다는 것이다. 어떤 object를 계속 유지하며, 변수의 내용을 가져다 쓰려면 이 방식은 맞지 않는 것 같다(내 생각) 그리고 이 function은 외부에 호출이 되기 전까지는 undefinded로 유지된다. |
2. () 가 있는 경우
Source var serial_maker = function(){ var prefix=' '; var seq=0; return{ set_prefix:function(p){ prefix = String(p); }, set_seq:function(s){ seq = s; }, gensym:function(){ var result = prefix +seq; seq +=1; console.log(">>" + result); return result; } }; }(); |
호출방법 serial_maker.gensym(); |
의미 Source를 보면 function이 끝나는 부분에 ()가 있다. 그 의미는 "function을 정의를 하고 실행을 해서 Return 값을 받는다." 이다. 그래서 호출하는 방법을 보면 "serial_maker.gensym()" 으로 " 이미 serial_maker function은 정의와 동시에 실행을 한 후에 function list를 리턴을 받은 상태이다. 그래서 바로 리턴받은 function중 하나인 gensym을 실행한다." 를 의미한다. 이것을 좀 더 의미 있게 해석을 하자면 이렇다. function을 위와 같이 정의하고 실행을 하게 되면 처음에 정의될 때 만들어진 새로운 object가 계속 유지되게 된다.그러므로 내부 변수의 값이 다시 리셋되지 않고 유지된다. 따라서 한 JSP page에서 이 function을 계속호출할 경우 seq +=1 때문에 숫자가 증가하는 것을 확인할 수 있다. 위로 미루어보아 당연한 이야기겠지만 이 function은 ()를 interpreter가 읽는 순간 undefinded에서 object가 생성된다. |
반응형