JavaScript/Javascript_Advanced

[JS]Function(함수) part.3

MoZZANG 2022. 4. 12. 20:07
JS에서의 CallByValue와 CallByReference는 Java와 동일하다.

 

 

1) CallByValue

var param=100,args=1;

//CallByValue]-값에 의한 호출.값이 전달

function callByValue(param,args){//매개변수 param,args는 지역변수
  var temp =param;
  param = args;
  args = temp;
  console.log('callByValue함수 안:param-%s,args-%s',param,args);
  }
   
window.callByValue(param,window.args);
console.log('callByValue함수 밖:param-%s,args-%s',window.param,window.args);

▲ 값을 전달하는 CallByValue는 함수안에서만 값이 스와핑되고 외부에서는 기존 값 그대로 출력된다.

 

 

 

2) CallByReference

//CallByReference]-참조에 의한 호출.값이 아닌 객체의 주소 전달.

var array = [100,1];
var callByRef= function(arr){
	var temp = arr[0];
    arr[0]=arr[1];
    arr[1]=temp;
    console.log('callByRef함수 안:arr[0]-%s,arr[1]-%s',arr[0],arr[1]);
   };
   
window.callByRef(array);
console.log('callByRef함수 밖:array[0]-%s,array[1]-%s',array[0],array[1]);

 

 

 


 

//※지역변수와 전역변수 충돌시 지역변수가 우선

var mVar =100;//전역 변수
function conflict(mVar){//매개변수는 지역변수
   //mVar = mVar*2;//매개변수 = 매개변수 *2
   console.log(this);//this는 window객체
   this.mVar = mVar*2;//this.mvar는 함수밖의 전역변수를 지칭한다
   console.log('conflict 함수 안:',mVar);
  }

conflict(mVar);
console.log('conflict 함수 밖:',mVar);

▲  Java는 block scope 즉, { }블락을 기준으로 지역변수와 전역변수가 나뉘는 반면에 JS는 함수 안과 밖을 기준으로 나뉘기 때문에 function scope 즉, 함수스코프라고 한다.

 

위 코드에서 var mVar는 함수 밖에서 선언되었으므로 전역변수 즉 해당 페이지 어디에서든지 사용가능한 변수이다. 하지만 함수 conflict의 매개변수는 해당 함수안에서만 사용가능한 지역변수이다. 변수 이름이 똑같기 때문에 헷갈릴 수 있다.

 

이럴 때 this를 사용해서 어디소속의 변수인지를 명확히 할 수 있다. 현재 함수안에서의 this는 해당 함수를 호출한 곳 즉, window가 된다. 따라서 this.mVar는 window.mVar와 동일하므로 this.mVar는 함수가 호출이 될 때 window객체의 속성이 되므로 함수 밖에서 선언된 mVar를 가리킨다.

 

▲함수내에 있는 this는 window객체이며 따라서 함수안에서의 mVar는 매개변수로 받은 100이되고, 함수를 호출한 뒤에는 mVar가 함수내의 연산결과에 의해 200이 되므로 함수밖에서 mVar는 200이 된다.

 

 

 


 

 //참조에 의한 호출 예제]

var member=[];
function setMember(numberOfMember,member){
   for(var i=0;i < numberOfMember;i++){
       member.push(prompt(i+1+'번째 이름 입력?',''));
       member.push(prompt(i+1+'번째 나이 입력?',''));
       member.push(prompt(i+1+'번째 주소 입력?',''));
      }
    }
    
var numberOfMember=parseInt(prompt('인원을 입력하세요?',1));
setMember(numberOfMember,member);
member.forEach(function(item){
  console.log(item);
})

▲ 사용자에게 인원을 입력받고 입력받은 인원수만큼 이름,나이,주소를 다시 입력받아서 member배열에 누적한다.

 

 

 

'JavaScript > Javascript_Advanced' 카테고리의 다른 글

[JS]DOM(Document Object Model) part.1  (0) 2022.04.13
[JS]Function(함수) part.4  (0) 2022.04.12
[JS]Function(함수) part.2  (0) 2022.04.12
[JS]Function(함수) part.1  (0) 2022.04.12
[JS]For문 & While문  (0) 2022.04.11