본문 바로가기
반응형
Programming/Javascript

Javascript 함수(function)에 대하여

by JAMINS 2020. 1. 8.

Function..

함수의 암묵적 전달인자.

객체의 메서드로 정의될 때, 함수의 암묵적 전달인자로 전달된다?

정의와 호출

  • 전달인자의 제한이 없다. 명시된 전달인자보다 많으면 무시된다.
  • 명시된 전달인자를 적지않으면 undefined값이 할당됨
  • 물론 위처럼 해서 정상작동 하는 경우가 있는 반면에, 아닌 경우도 있다.

함수 리터럴

function test(x) { ... } 
var test = function(x) { ... }

함수 리터럴을 이용하여 정의할 수도 있음.
이름을 붙이지 않아도 되는 익명 함수일 때 적합.

선택적으로 함수 이름을 명명하는 것도 허용 (Javascript 1.5 이전 버전은 제대로 동작 안할 수 있음)
익명 함수인데 재귀호출을 사용할 경우 쓰임.

var test = function testScript(x) {...}

함수 전달인자

타입이 느슨한 언어라 데이터 타입을 미리 선언하는 것이 불가능. 가변적으로 전달인자를 받을 수 있다.

생략 가능한 전달인자

지정된 전달인자 개수보다 적은 수의 인자를 받으면 남은 것들은 undefined로 된다.

구현할 때 생략가능한 인자들의 위치를 끝에 넣는게 좋다.
(function a(a, b) 일 때, a(1) 이라면 a는 절대 생략이 안됨, 하려면 명시적으로 null, undefined를)

가변길이 전달인자 목록(전달인자 객체 Arguments)

function 몸체에서 사용할 수 있는 arguments 객체
callee 프로퍼티

function test(a,b) {
    if (arguments.length == 2) {
        ...
    }
}

지정되지 않은 인자의 값도 arguments[n] 으로 접근할 수 있다.

arguments 값을 변경하면 전달인자의 값도 변경된다

Arguments는 배열이 아닌 객체다

callee 프로퍼티

현재 실행되고 있는 함수를 가리킨다.
거의 사용되지 않음.

익명함수도 재귀적으로 자기자신을 호출할 수 있다

function(x) {
    if (x <= 1) return 1;
    return x * arguments.callee(x-1);
}

객체 프로퍼티를 전달인자로 사용하기

전달할 함수의 인자들이 많을 때 어떤 값을 어떤 순서로 넣어야하는지 기억하기 어려워진다. 이때 객체 리터럴로 정의하여 객체를 넘기는 방식으로 사용.

데이터로서의 함수

함수는 변수에 할당되거나 객체 프로퍼티와 배열 원소들에 저장될 수 있으며 함수의 전달인자로 사용할 수도 있다.

메서드로서의 함수

객체 프로퍼티로 함수를 정의할 수 있다.
호출된 메서드 내부에서 해당 객체를 this 키워드로 가리킬 수 있다.

var calculator = {
    op1 : 1,
    op2 : 2,
    compute: function() {
        this.result = this.op1 + this.op2;
    }
}

this 키워드로 해당 메서드는 메서드가 속해있는 객체를 암묵적 전달인자로 건네받는다.

  • 객체 내 메서드 프로퍼티에서 this : 해당 객체
  • 함수로 호출했을 때의 this : 전역 객체

생성자 함수

new로 생성, this로 생성자 함수 호출

함수 프로퍼티와 메서드

함수를 typeof 하면 function 반환.
함수는 특수화된 종류의 객체. 그러므로 프로퍼티와 메서드가 있다.

length프로퍼티

arguments.length 는 전달 인자의 개수
함수 자체에서 length는 읽기전용이고 함수에 정의된 매개변수의 개수 반환

함수의 length는 함수 내외 모두 사용가능.

prototype프로퍼티

미리 정의된 prototype 객체를 가리키는 prototype프로퍼티가 있다.
함수가 new 생성자로 사용될 때 중요한 역할을 한다. 추후 설명

나만의 함수 프로퍼티 정의

함수 호출 경계를 넘어서 존재가 유지되야하는 변수를 사용할 때,

전역 변수를 정의하여 사용하는 것 보다,
function객체의 프로퍼티를 사용하는 것이 좋다

// 함수의 프로퍼티로 counter 선언. 코드 실행전에 함수가 처리되므로 가능
test.counter = 0;

function test() {
    return test.counter++;
}

apply(), call()

모든 함수에 대해 apply(), call() 메서드를 정의
함수가 마치 다른 객체에 있는 것처럼 호출할 수 있다.

f.call(o, 1, 2);

o.m = f;
o.m(1,2);
delete o.m;

apply() 는 call과 유사하지만 함수로 건네줄 인자들이 배열이라는 점이 다르다.

f.call(o, [1, 2]);

댓글