[JS] 함수 (변수, 선언 방식)

·2024년 3월 4일

Javascript

목록 보기
4/17

scope

변수가 사용될 수 있는 범위 (변수의 생존 범위)

매개변수 (parameter) VS 인자(argument)

  • 매개변수 : 실행할 때마다 바뀌는 값을 변수로 처리한 것 (parameter)
  • 함수를 실행할 때 매개 변수 자리에 넘겨주는 실제 값 (argument)
//매개변수의 자료형을 적지 않는다...
function sum(a,b){
  let res = a+b;
  console.log(res);
}

//리턴의 자료형도 적지 않는다
function add(x,y){
  let z = x+y;
  return z;
}

삼항연산자와 return

삼항연산자에 대한 명령 결과로 return 을 적으면 빨간줄이 뜬다.
삼항 연산자 자체가 결과값을 return 하는 명령어이기 때문.
(C++에서는 됐던 것 같은데? 아닌가?)

//틀린 문법
 function seven(a,b,c){
            let res = a*b*c;
            return (res%7==0 ? return res : return -1);
        }

즉, 위와 같은 문법이라면 return return res 과 같은소리가 되어 오류가 뜬다.

그럼 어떻게 적어야하나?

 function seven(a,b,c){
            let res = a*b*c;
            return (res%7==0 ? res : -1);
            //삼항에는 리턴이 내부적으로 포함이 되어있다
        }

통일성 있는 더 좋은 코드

조건에 따라 return 값이 바뀌는 경우
if로 분기를 나누어 return값을 여러번 돌리는 것 보다,
모든 조건에서 return을 하기 위해 하나만 돌리는게 낫다!

무슨 소리냐

//아쉬운 코드
function add(x,y,z){
  let data = x*y*z;
  
  if(data%7==0) return data;
  else return -1; // else -1 로 입력하게 되면?
}

이 코드 같은 경우에는, 만약에 내가 마지막줄에 return을 입력하는 것을 까먹어도, 함수 실행 자체에 있어서 오류가 나지는 않는다.
하지만 undefined가 뜨는 문제가 발생한다.

이를 이런 방법으로 좀 더 깔끔하게 만들 수 있다.

function add(x,y,z){
  let data = x*y*z;
  let result=-1;
  
  if(data%7==0) result = data;
  
  return result;
}

즉, return 할 변수 하나를 설정하고, 조건에 해당하는 경우에만 이 변수를 바꿔주면 된다!
이러면 return을 여러 번 입력할 필요도 없고, 무조건 결과값이 return이 되므로 디버깅도 편하다!

함수의 선언 종류

선언식

 function expression(){
            
        };
 expression1(); //함수 명으로 사용

표현식 (익명함수)

let expression2 = function (){

        };
expression2(); //함수 이름 대신 할당한 변수 이름으로 함수 사용

표현식의 경우, 이름이 없기 때문에 익명 함수라고한다.

var 변수와 호이스팅

호이스팅: 끌어올리다

변수를 뒤에서 선언하지만, 마치 미리 앞에서 선언한 것처럼 인식함

console.log(age); //age가 선언이 되지 않았기 때문에 오류가 날 것 같지만, 안난다!
var age= 13;

위 예시처럼 age가 선언도, 할당도 되지 않았으나 undefined가 뜬다.
다만, let과 const같은 경우, 호이스팅이 일어나지 않아 오류가 뜬다.

그럼 var이 좋을까 let이 좋을까?
엄격할 수록 오류가 일어났을 때 원인을 찾기 쉽다. (안정성이 높다)
즉, var대신 let을 쓰는 것이 더 좋다.

참고로, 함수도 호이스팅이 가능하다.

sum();
function sum(){
  console.log('sum()'); //잘 실행된다!
}

다만, 표현식을 이용할 경우 var을 쓰던 let을 쓰던 호이스팅이 되지 않는다.

divide(); //오류가 난다!
var divide() = function () {
	console.log('divide()'); //실행 안됨
}

즉, let과 표현식을 이용한 함수 표현이 근래에는 선호된다!

더 자세히

사실 let , var, const 모두 호이스팅이 일어난다.
var의 경우, 변수에 실제 할당 전 undefined가 먼저 들어가게 되는데, 따라서 호이스팅 시 undefined가 뜬다.
하지만 let, const의 경우, undefined가 먼저 들어가기 전에 실행이 되기 때문에 에러가 뜨는 것!

최종정리 (var VS let VS const)

변수의 선언 및 초기화, 할당

  • 선언 -> 초기값 할당(undefind)-> 할당(우리가 원하는 값)

hosting 여부

var,let,const 모두 가능하긴 하다.

scope

  • var : {local}, global - 함수 레벨 (코드블럭 안에는 지역변수, 밖에서는 전역변수)
    => 선언된 함수 내에서 계속 생존한다
  • let, const : {} - 블럭 레벨 (코드블럭 안에 있으면 지역변수)
    => 선언된 블럭 내에서만 생존 가능하다

재할당, 재선언 여부

  • var: 재선언 O, 재할당 O
  • let : 재선언X, 재할당 O
  • const : 재선언X, 재할당 X

콜백함수

앞서 표현식으로 함수를 선언하면 호이스팅이 되지 않아 안정성에 좋다고 말했다.
또, 선언식보다 높은 안정성으로 다른 함수의 인자로 전달할 수 있게 된다!

이렇듯 다른 함수의 인자로 어떠한 함수를 넘겨주는 것을, 콜백함수라고 한다.

profile
풀스택 호소인

0개의 댓글