모든 저작권은 <생활코딩>의 생산자인 <egoing>님에게 있습니다.
문제시, 비공개로 전환하겠습니다.
<함수지향>
함수지향 카테고리의 하위 수업들은 함수형 언어로서 자바스크립트의 면모를 다룬다.
자바스크립트의 핵심적인 도구는 함수다. 자바스크립트의 함수는 매우 강력하다.
함수에 대한 이해 없이는 자바스크립트를 잘 다루기 어렵다. 또한 자바스크립트에서 함수는
객체를 이해하는 데 가장 중요한 기초를 이룬다. 하지만 난이도가 조금 있는 내용이다.
기초수업을 이수했다면 구체적인 자바스크립트의 호스트 환경에 대한 학습으로 넘어가도 된다.
함수에 대한 고급 내용을 다루는 본 카테고리는 나중에 학습해도 좋다. 하지만 언젠가는 꼭 정복해야 할 부분이다.
사실 그렇게 어렵지도 않다. 다만 코드를 처음 다루는 입문자라면 함수와 관련된 기능들의 취지에 공감이 잘 안될지도 모르겠다.
1. 유효범위
유효범위(Scope)는 변수의 수명을 의미한다. 아래의 예제를 보자. 결과는 global이다. var vscope = 'global'; function fscope(){ alert(vscope); } fscope(); 함수 밖에서 변수를 선언하면 그 변수는 전역변수가 된다. var vscope = 'global'; function fscope(){ var vscope = 'local'; alert('함수안 '+vscope); } fscope(); alert('함수밖 '+vscope); var vscope = 'global'; function fscope(){ vscope = 'local'; alert('함수안'+vscope); } fscope(); alert('함수밖'+vscope); |
유효범위의 효용 지역변수의 사용 function a (){ var i = 0; } for(var i = 0; i < 5; i++){ a(); document.write(i); } 실행결과 -> 01234 function a (){ i = 0; } for(i = 0; i < 5; i++){ a(); document.write(i); } |
전연변수의 사용 MYAPP.calculator = { //-> calculator라는 속성 'left' : null, // -> caluclator의 속성을 초기화함. 'right' : null //-> } MYAPP.coordinate = { //MYAPP이라는 전역변수에 속성의 값으로 coordinate를 줌 'left' : null, 'right' : null }
MYAPP.calculator.left = 10; MYAPP.calculator.right = 20; function sum(){ return MYAPP.calculator.left + MYAPP.calculator.right; } document.write(sum()); (function(){ var MYAPP = {} // 함수안에서 선언된 변수 MYAPP. 더 이상 전역변수가 아니라 function의 지역변수가 됨. MYAPP.calculator = { 'left' : null, 'right' : null } MYAPP.coordinate = { 'left' : null, 'right' : null } MYAPP.calculator.left = 10; MYAPP.calculator.right = 20; function sum(){ return MYAPP.calculator.left + MYAPP.calculator.right; } document.write(sum()); }()) |
유효범위의 대상 (함수) var name = 'coding everybody'; } alert(name); for(int i = 0; i < 10; i++){ String name = "egoing"; } System.out.println(name); |
정적 유효범위 var i = 5; //전역변수 function a(){ var i = 10; //지역변수 b(); } function b(){ document.write(i); // b라는 함수안에 i라는 지역변수가 존재하는지 찾게된다. 하지만 지역변수가 존재하지 않음으로 전역변수를 찾는다. //함수b가 정의된 시점에서의 전역변수를 찾는다. } a(); *함수b가 정의된 시점에서의 전역변수가 사용된다. 함수 b()가 호출된 시점에서의 지역변수가 사용되지 않는다. 사용될 때 변수를 바라보게 된다면 동적인 것 |
2. 값으로서의 함수와 콜백
값으로서의 함수 a = { b:function(){ // b는 어떠한 값을 저장하고 있는 그릇이다. key라고 한다. b는 a 객체안에서 변수같은 역할을하고 있다. (속성, Property) } }; function cal(func, num){ 10행을 실행하면 함수 increase와 값 1이 함수 cal의 인자로 전달된다. 함수는 함수의 리턴 값으로도 사용할 수 있다. function cal(mode){ 당연히 배열의 값으로도 사용할 수 있다. var process = [ |
콜백 - 값으로서의 함수 <!DOCTYPE html> function sortNumber(a,b){ {"title":"JavaScript", "author":"egoing"} demo1.html |
3. 클로저
클로저(closure)는 내부함수가 외부함수의 맥락(context)에 접근할 수 있는 것을 가르킨다. 내부함수 function outter(){ function inner(){ var title = 'coding everybody'; alert(title); } inner(); } outter(); 위의 예제에서 함수 outter의 내부에는 함수 inner가 정의 되어 있다. 함수 inner를 내부 함수라고 한다. function outter(){ var title = 'coding everybody'; function inner(){ alert(title); } inner(); } outter(); 클로저 function outter(){ var title = 'coding everybody'; return function(){ alert(title); } } inner = outter(); inner(); 조금 더 복잡한 아래 예제를 살펴보자. function factory_movie(title){ return { get_title : function (){ //메소드 return title; }, set_title : function(_title){ //메소드 title = _title } } } ghost = factory_movie('Ghost in the shell'); matrix = factory_movie('Matrix'); alert(ghost.get_title()); alert(matrix.get_title()); ghost.set_title('공각기동대'); alert(ghost.get_title()); 위의 예제를 통해서 알 수 있는 것들을 정리해보면 아래와 같다. function factory_movie(title){ // 외부함수의 지역변수인 title은 factory_movie는 어떠한 값을 return하면 생이 마감됐기때문에 그 지역변수인 title return { get_title : function (){ //메소드 return title; }, set_title : function(_title){ //메소드 if(typeof _title === 'String') { ghost = factory_movie('Ghost in the shell'); 아래의 예제는 클로저와 관련해서 자주 언급되는 예제다. var arr = [] for(var i = 0; i < 5; i++){ arr[i] = function(){ return i; } } for(var index in arr) { console.log(arr[index]()); } 5 5 5 5 5 var arr = [] for(var i = 0; i < 5; i++){ arr[i] = function(id) { return function(){ return id; } }(i); } for(var index in arr) { console.log(arr[index]()); } 0 1 2 3 4 클로저 참고 http://ejohn.org/apps/learn/#48 http://blog.javarouka.me/2012/01/javascripts-closure.html |
4. arguments
함수에는 arguments라는 변수에 담긴 숨겨진 유사 배열이 있다. 예)
var i, _sum = 0; // _sum은 출력값을 담을 변수이다. for(i = 0; i < arguments.length; i++){ // arguments는 특수한 이름의 변수이다. 이 변수안에는 arguments라는 유사배열이 담겨져있다. document.write(i+' : '+arguments[i]+'<br />'); _sum += arguments[i]; } return _sum; } document.write('result : ' + sum(1,2,3,4)); 매개변수의 수 function zero(){ console.log( 'zero.length', zero.length, 'arguments', arguments.length ); } function one(arg1){ console.log( 'one.length', one.length, 'arguments', arguments.length ); } function two(arg1, arg2){ console.log( 'two.length', two.length, 'arguments', arguments.length ); } zero(); // zero.length 0 arguments 0 one('val1', 'val2'); // one.length 1 arguments 2 two('val1'); // two.length 2 arguments 1 |
5.함수의 호출
함수호출 } func(); JavaScript는 함수를 호출하는 특별한 방법을 제공한다. function sum(arg1, arg2){ return arg1+arg2; } alert(sum.apply(null, [1,2])) 좀 더 흥미로운 예제를 살펴보자. 결과는 6과 185이다. o1 = {val1:1, val2:2, val3:3} o2 = {v1:10, v2:50, v3:100, v4:25} function sum(){ var _sum = 0; for(name in this){ _sum += this[name]; } return _sum; } alert(sum.apply(o1)) // 6 -> 독립되어있는 함수가 sum.apply(o1)을 하게되면, 이 라인이 실행되는 순간에는 o1이라는 객체의 sum이라는 메소드가 된다. (o1.sum) alert(sum.apply(o2)) // 185 -> o2.sum o1.sum = sum; alert(o1.sum()); delete o1.sum(); sum의 o1 소속의 메소드가 된다는 것은 이렇게 바꿔 말할 수 있다. 함수 sum에서 this의 값이 전역객체가 아니라 o1이 된다는 의미다.
if(typeof this[ame] !== 'funtion') } return _sum; o1 = {val1:1, val2:2, val3:3, sum:sum} |
댓글