• 함수 표현식 vs 함수 선언식
  • 함수를 함수에 전달해 주기
  • 함수를 반환하는 함수 Closures
  • 유효범위 체인 Scope Chain
  • 즉시실행함수 IIFE

function

  • 함수는 명령문의 묶음이며 재샤옹 가능하다. (기능, 코드 묶음, 모듈)
  • 자바스크립트 함수는 객체이다.
  • 1급 객체(First Class Object)이다.
  • 함수는 객체이므로 속성을 가질 수 있다.
  • 이유는 객체란? 속성의 집합이기 때문이다.
  • 함수는 유일하게 호출 가능(코드 재사용, 발동 시기(이벤트)를 조정)한 객체이다.

함수 표현식 vs 함수 선언식

  • 함수선언식함수표현식은 함수호출는 크게 다르지 않다.
  • 함수표현식 호이스팅(hoisting) 현상 발생이 되어 오류가 발생이 될 수 있다.

1. 함수를 정의하는 방법 : 선언식 (함수 이름으로 정의하는 방법)

function drinkMilk() {
	console.log('밀크를 마시다');
	// return값이 없으면 기본값 undefined. (return을 쓰지 않으면 암묵적으로 undefined)
	return undefined;
}

2. 함수 표현식을 변수에 참조하는 방법 : 표현식 (함수 값(리터럴)을 변수에 할당하는 방법)

var lookAt = function(){
  console.log('무엇무엇을 응시하다.');
};

함수를 함수에 전달해 주기

  • 함수의 인자값으로 함수도 들어갈 수 있다 (함수를 가리키는 변수)
function calculate(num1, num2, type) {
	// [검증] arguments 갯수
	var argLen = arguments.length;
	if( argLen !== 3) {
		console.log('매개변수 3개를 넣어야 합니다.');
		return;
	}

	// [검증] 매개변수 type
	if ( typeof num1 !== 'number' && typeof num2 !== 'number' ) {
		console.log('매개변수가 숫자열이어야 합니다.');
		return;
	}
	if ( typeof type !== 'function' ) {
		console.log('3번째 매개변수가 함수열이어야 합니다.');
		return;
	}

	if ( type === sum ) {
		return sum(num1, num2);
	}

	if ( type === minus ) {
		return minus(num1, num2);
	}

	if ( type === multiply ) {
		return multiply(num1, num2);
	}
}

var sum = function(num1, num2) {
	return num1 + num2;
};

var minus = function(num1, num2) {
	return num1 - num2;
};

var multiply = function(num1, num2) {
	return num1 * num2;
};

var sumResult = calculate(10, 20, sum);
var minusResult = calculate(10, 20, minus);
var minusResultResult = calculate(10, 20, multiply);
console.log('sum', sumResult);
console.log('minus', minusResult);
console.log('multiply', minusResultResult);

함수를 반환하는 함수 - Closures

  • 함수를 반환하는 값을 변수에 참조하여 호출.
function getAdd( num1, num2 ) {
	var result = num1 + num2;
	return function() {
		console.log(result);
	}
}

var a = getAdd(1, 2);
console.log(typeof a); // function
a();

변수의 유효범위 : 변수의 접근은 어떻게 될까?

var globalName = 'Kim';
function setName( lastName ) {
	var firstName = 'Youn';
	console.log( 'my mane is ', firstName + lastName );
}

console.log(globalName); // Kim
console.log(firstName); // firstName is not defined

유효범위 체인(Scope Chain)

function setNames(lastName) {
	function printName() {
		var firstName = 'youn';
		console.log( 'my mane is ', firstName + lastName );
	}
	printName();
	console.log(firstName); // undefined
}

IIFE(즉시실행함수)

+function(){}();

~function(){}();

!function(){}();

(function(){
  
}());

(function(){})();
(function() {
	var a = 3;
	function getA() {
		return a;
	}
	console.log(getA()); // 3
}());

console.log(getA()); // 접근이 불가능