변수가 사용될 수 있는 범위 (변수의 생존 범위)
//매개변수의 자료형을 적지 않는다...
function sum(a,b){
let res = a+b;
console.log(res);
}
//리턴의 자료형도 적지 않는다
function add(x,y){
let z = x+y;
return z;
}
삼항연산자에 대한 명령 결과로 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(); //함수 이름 대신 할당한 변수 이름으로 함수 사용
표현식의 경우, 이름이 없기 때문에 익명 함수라고한다.
호이스팅: 끌어올리다
변수를 뒤에서 선언하지만, 마치 미리 앞에서 선언한 것처럼 인식함
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,let,const 모두 가능하긴 하다.
앞서 표현식으로 함수를 선언하면 호이스팅이 되지 않아 안정성에 좋다고 말했다.
또, 선언식보다 높은 안정성으로 다른 함수의 인자로 전달할 수 있게 된다!
이렇듯 다른 함수의 인자로 어떠한 함수를 넘겨주는 것을, 콜백함수라고 한다.