함수

2022. 5. 9. 03:23·JavaScript
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
반응형
저작자표시 (새창열림)

'JavaScript' 카테고리의 다른 글

생성자 함수  (0) 2022.05.14
스코프 / 프로퍼티 어트리뷰트  (1) 2022.05.14
객체  (0) 2022.05.04
타입 변환,단축 평가  (1) 2022.04.29
표현식과 문/ 데이터 타입/연산자  (1) 2022.04.25
'JavaScript' 카테고리의 다른 글
  • 생성자 함수
  • 스코프 / 프로퍼티 어트리뷰트
  • 객체
  • 타입 변환,단축 평가
Hun-bot
Hun-bot
IT를 중심으로 다양한 것
  • Hun-bot
    로봇이 만드는 눈사람
    Hun-bot
  • 전체
    오늘
    어제
    • All Article (128)
      • Programmers (6)
        • TIP (1)
        • SQL (2)
        • LV1 (1)
        • LV2 (2)
        • LV3 (0)
      • Baekjoon (31)
        • Bronze (10)
        • Silver (19)
        • Gold (2)
        • Platinum (0)
        • Diamond (0)
      • Leetcode (0)
        • Easy (0)
        • Medium (0)
        • Hard (0)
        • SQL (0)
      • 알고리즘(Algorithm) (42)
      • JavaScript (40)
      • Linux (7)
      • JSP (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      Python #알고리즘
      자바스크립트 #연습문제
      Algorithm
      JS #클래스
      오블완
      JavaScript #Set #Collection
      Javascript
      JSP #Vscode #톰켓 #Tomcat #Java #Web #jdk
      JS #javascript #객체 #Object
      SQL
      고득점 Kit
      리눅스 #입문
      Vue #Vue.js #정리
      JS #정규표현식
      프로그래머스 #자바스크립트 #JS
      async await #js #문법 #자바스크립트 #비동기
      프로그래머스
      알고리즘 #Algorithm
      LeetCode #JS #Javascript #Algorithm
      BaekJoon
      알고리즘
      리눅스
      백준
      Programmers
      티스토리챌린지
      JS #프로그래머스 #숫자의표현 #알고리즘
      JS #JavaScript #프로그래머스 #카카오
      JS #JavaScript #프로그래머스 #알고리즘
      자바스크립트
      c++
    • 최근 댓글

    • hELLO· Designed By정상우.v4.10.3
    Hun-bot
    함수
    상단으로

    티스토리툴바

    티스토리툴바