자바스크립트 함수

Parameter와 Argument

  • parameter는 함수를 정의할 대 사용.
1
2
3
function foo(param1, param2) {
...
}
  • Argument 는 함수를 호출할 때 사용.
1
foo(3, 7);

함수 정의 방법 2가지

  • 함수 선언 (Function Declarations)

    1
    2
    3
    function functionName(){

    }
  • 함수 표현식 (Function Expression)
    함수 표현식에서의 함수는 익명함수로 간주됨 ( 람다 함수라고 부르기도 함 )
    반드시 호출 하기전에 할당해야 함

    1
    2
    3
    4
    var functionName = function(){


    }

함수 호이스팅(hoisting)

  • 함수 선언부를 함수 호출보다 먼저 읽고 실행

    1
    2
    3
    4
    sayHi();
    function sayHi() {
    alert('Hi');
    }

  • 함수 표현식에서는 에러 발생

    1
    2
    3
    4
    sayHi(); // 에러 발생
    var sayHi = function(){
    alert('Hi');
    }
  • 절대 해서는 안되는 방식
    함수 선언은 호이스팅이 되기 때문에 브라우저마다 처리되는 방식이 다름

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(condition){
    function sayHi() {
    alert('Hi');
    }
    }else{
    function sayHi() {
    alert('Yo');
    }
    }
  • 함수 표현식을 할당을 통한 방식은 안전함

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // condition에 따라 함수 표현식 할당
    var sayHi;

    if(condition){
    sayHi = function() {
    alert('Hi');
    }
    }else{
    sayHi = function() {
    alert('Yo');
    }
    }

재귀

arguments.callee는 현재 실행중인 함수를 가리키는 포인터
재귀함수를 사용할 때 항상 자신을 호출하는 이름대신 arguments.callee를 써야 안전함
실행 중 호출하는 함수가 지워지거나 변경 되었을 때를 예방

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function factorial(num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
}

// 스트릭 모드에서는 arguments.callee 값에 접근할 수 없어 에러가 발생
// 함수 표현식으로 사용해야 함
var factorialExpression = (function f(num){
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num-1);
}
})

클로저

  • 다른 함수의 스코프에 있는 변수에 접근 가능한 함수
  • 함수 호출시 실행 컨텍스트와 스코프 체인이 생성