JavaScript

함수

Hun-bot 2022. 5. 9. 03:23
728x90
반응형

함수 리터럴

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)

728x90
반응형