함수 리터럴
const t=function hi(a,b){
return a+b;
}
함수리터럴만 아래처럼 이름 생략이 가능하다
const t=function(a,b){
return a+b;
}
t(1,2)
결과: 3
리터럴: 값을 생성하기 위한 표기법(사람 이해) -> 함수 리터럴도 평가되어 값을 생성 -> 값은 객체 -> 함수는 객체
함수는 정의하는 것, 변수는 선언하는 것
함수 선언식
function hi(a,b){
return a*b;
}
//undefined
이름 생략이 불가능하다.
함수 선언식은 표현식이 아닌 문 이다!
표현식이 아닌 문을 실행하면 항상 undefined를 출력하고( 완료 값 ) 위에 코드를 실행시켜보면 undefined가 나오는것을 알 수 있다.
표현식이 아닌 문은 변수에 할당할수없다.(값으로 평가불가하므로) 하지만 아래 muti함수가 변수에 할당된것처럼 보인다
왜냐하면 자바스크립트에서 중의적 표현을 가진 것들은 중의적으로 해석할수 있기 때문이다.
{} (블록문), {}
복습
let k=let t; ??
=> 표현식이 아닌 문이므로 변수에 할당 할 수 없다!!
const muti=function muti(a,b){
return a*b;
}
console.log(muti(3,4))
여기서 muti는 const로 선언한 muti다 (식별자)
function t(){console.log('hi')}
t()
=> hi
괄호로 묶었다.
(function f(){console.log('hi')})
f();
Uncaught ReferenceError: f is not defined
at <anonymous>:2:1
이름을 제거
(function(){console.log('hi')})
()
-> hi
익명 즉시 실행
(function(){console.log('hi')} () )
가명 즉시 실행
(function f(){console.log('hi')}f())
괄호로 묶은 코드는 왜 ReferenceError ??
() 그룹 연산자의 피연산자는 값으로 평가 될수있어야함
-> 안에 있는 함수 f()는 선언문으로 해석되지않고 함수 리터럴 표현식으로 해석된다. -> 표현식이 아닌 문 ( 값 평가X )
"함수 이름은 함수 몸체 안에서만 참조할수 있는 식별자" -> ( ) 이게 막아버리니깐 f( )는 외부에서 실행한게 되서 에러
이름을 제거한건 왜 실행될까?? => 함수 선언문으로 동작하기에 실행이 된다. (값으로 인식)
fuction t()의 동작 -> 식별자를 암묵적으로 생성하고 거기에 함수 객체를 할당하는 방식으로 동작한다. (맨위 muti처럼)
자바스크립트 함수는 "일급 객체"다. => 함수를 값처럼 자유롭게 다룰수 있음
함수 생성 시점과 호이스팅
console.dir(hi) //f hi(a,b)
console.dir(there)
console.log(hi(5,6)) //30
console.log(there(4,5))
function hi(a,b){
return a*b;
}
const there=function(a,b){
return a*b;
}
Uncaught ReferenceError: there is not defined
at <anonymous>:2:13
선언문인 hi는 호이스팅이 됬지만 표현식은 there에는 호이스팅이 되지않고 에러를 발생시킨다.
-> 당연히 함수의 생성 시점이 달라서 ( 선언문(모든 선언문동일) 자바스크립트 엔진에 의해 먼저 실행 )
-> 함수 표현식으로 함수를 정의시 변수 호이스팅이 발생함 ( there라는 변수에 할당하는 시점은 '런타임'
<코드를 위에서부터 아래로 읽어내리는> 과정중에 실행되기에 함수 리터럴도
할당문이 실행되는 시점에 평가되어 함수 객체가 된다.)
return 반환문
- 반환되는 시점에 break역할도 같이함
- 뒤에오는 표현식을 평가해 반환함
콜백함수
function repeat(n,f){
for (let index = 0; index < n; index++) {
f(index)
}
}
const logAll=function hi(i){ //hi가 없어도됨
console.log(i)
}
repeat(10,logAll)
함수의 매개변수를 통해 다른 함수의 내부로 전달되는 함수를 콜백 함수
매개변수를 통해 함수의 외부에서 콜백 함수를 전달받은 함수를 고차함수(HOF - Higher Order Function)
'JavaScript' 카테고리의 다른 글
생성자 함수 (0) | 2022.05.14 |
---|---|
스코프 / 프로퍼티 어트리뷰트 (1) | 2022.05.14 |
객체 (0) | 2022.05.04 |
타입 변환,단축 평가 (0) | 2022.04.29 |
표현식과 문/ 데이터 타입/연산자 (0) | 2022.04.25 |