- 함수 표현식 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(즉시실행함수)
- Immediately Invoked Function Expression
- 외부와 단절된 독립된 공간이 형성,
캡슐화
가 가능하여 전역변수와 충돌을 피할 수 있다.
+function(){}();
~function(){}();
!function(){}();
(function(){
}());
(function(){})();
(function() {
var a = 3;
function getA() {
return a;
}
console.log(getA()); // 3
}());
console.log(getA()); // 접근이 불가능