함수


[ 함수를 생성하는 방식 ]

  1. 함수 선언문 ( 함수 리터럴 )

    add(2, 3); // 5
    
    function add(x, y){
    	return x + y;
    }
    
    add(3, 4); // 7
    

    : 함수 선언문으로 정의된 함수는 반드시 함수명이 있어야 한다. (기명 함수) : 함수 호이스팅이 일어난다.

  2. 함수 표현식

    factorialFunc(5); // Uncaught ReferenceError: factorialFunc is not defined
    
    const factorialFunc = function factorial(n){
    	if(n <= 1){
    		return 1;
    	}
    	return n * factorial(n - 1);
    };
    
    factorialFunc(7); // 5040
    

    : 함수 표현식으로 정의된 함수는 함수명은 선택사항이다. 그러나 보통은 익명함수를 사용한다. 함수 내부에서 함수 이름으로 재귀적인 호출이 필요할 때 기명함수를 사용한다.

    : 함수 호이스팅이 일어나지 않는다.

  3. Function() 생성자 함수

    const add = new Function('x', 'y', 'return x + y');
    

    : 함수 선언문이나 함수 표현식 모두 내부적으로는 Function() 생성자 함수를 통해 함수를 생성한다. (참고)

[ 함수는 일급객체다 ]

“일급객체” 의 필요조건 7가지

  1. 리터럴에 의해 생성된다. ⭕️

    function func(){}
    
  2. 변수, 배열의 요소, 객체의 프로퍼티 등에 할당 가능하다. ⭕️

    // 변수에 할당
    const func = function(){ return 100; };
    console.log(func());     // 100
    
    // 배열의 요소
    const arr = [func()];    // [100]
    
    // 객체의 프로퍼티에 할당
    const obj = {};
    obj.func = function(){ return 100; }
    console.log(obj.func()); // 100
    
  3. 함수의 인자로 전달할 수 있다. ⭕️

    const foo = function(func){
    	func();
    }
    
    foo(function(){ console.log('Hello World') }); // Hello World
    
  4. 함수의 리턴값으로 리턴할 수 있다. ⭕️

    const func = function(){
    	return function(){
    		console.log('return value : function');
    	};
    };
    
    const anotherFunc = func();
    anotherFunc(); // return value : function 
    
  5. 동적으로 프로퍼티를 생성하고 할당할 수 있다. ⭕️

    스크린샷 2022-05-12 오전 10.16.46.png

    : 함수 객체는 일반 객체와는 다르게 함수 객체만의 표준 프로퍼티가 정의되어 있다. arguments / caller / length / prototype

    스크린샷 2022-05-12 오후 1.57.30.png

    전달되는 인자에 따라 length 프로퍼티가 결정된다.

    스크린샷 2022-05-12 오후 2.11.40.png

    함수 자체의 prototype 프로퍼티는 (본인을 참조하는)constructor 프로퍼티와 (Object.prototype을 가리키는)[[Prototype]] 프로퍼티를 가진 객체를 가리킨다.

[ 함수 호출과 this ]

: 함수가 호출되는 방식에 따라 this 에 바인딩되는 객체의 대상이 달라진다.