자바스크립트 함수(Javascript function)





함수 객체

- 자바스크립트에서 함수는 객체

- 객체는 프로토타입 객체로 숨겨진 연결을 갖는 이름/값 쌍들의 집합체

- 객체 중 객체 리터럴로 생성되는 객체는 Object.prototype에 연결됨

- 반면에, 함수 객체는 Function.prototype에 연결됨(Function은 Object.prototype에 연결됨)

- 모든 함수는 추가적인 속성이 있음: 함수의 문맥(context), 함수의 행위를 구현하는 코드(code)

- 모든 함수 객체는 prototype이라는 속성이 있음. 

  이 속성의 값은 함수 자체를 값으로 갖는 constructor라는 속성이 있는 객체.

  이것은 Function.prototype으로 숨겨진 연결과는 구분됨.


- 함수는 객체이기 때문에 다른 값들처럼 사용할 수 있음

- 함수는 변수나 객체, 배열등에 저장, 다른 함수에 전달하는 인수로도 사용, 함수의 반환값으로 사용


- 함수를 다른 객체와 구분짓는 특징은 호출할 수 있다는 것





함수 리터럴

- 함수 객체는 함수 리터럴로 생성할 수 있음


- 함수 리터럴의 네가지 부분: function이라는 예약어, 함수의 이름(선택적), 

                                            괄호로 둘러싸인 함수의 매개변수 집합, 중괄호로 둘러싸인 문장들의 집합


- 함수 리터럴은 표현식이 나올 수 있는 곳이면 어디든지 위치할 수 있음

- 함수는 다른 함수 내에서도 정의 가능

- 함수 리터럴로 생성한 함수 객체는 외부 문맥으로의 연결이 있는데 이를 클로저(closure)라고 함






호출

- 함수를 호출하면, 현재 함수의 실행을 잠시 중단하고 제어를 매개변수와 함께 호출한 함수로 넘김

- 모든 함수는 명시되 있는 매개변수에 더해, this, arguments라는 추가적인 매개변수 두개를 받게 됨

- this 매개변수는 객체지향 프로그래밍의 관점에서 매우 중요, 호출하는 패턴에 의해 값이 결정됨


- 함수를 호출하는 네가짖 패턴: 메소드 호출 패턴, 함수 호출 패턴, 생성자 호출 패턴, apply 호출 패턴

- 각 패턴에 따라 this라는 추가적인 매개변수를 다르게 초기화



메소드 호출 패턴

- 함수를 객체의 속성에 저장하는 경우 이 함수를 메소드라고 부름

- 메소드를 호출할 때, this는 메소드를 포함하고 있는 객체에 바인딩 됨(this는 객체 자체가 됨)

- 호출되는 표현식이 세부지정(마침표나 [])를 포함하고 있으면 이 방법이 메소드 호출 패턴임


- 메소드는 자신을 포함하는 개체의 속성들에 접근하기 위해서 this를 사용할 수 있음

- this를 사용해 객체의 값을 읽거나 변경할 수 있음

- this와 객체의 바인딩은 호출 시에 일어남

   매우 늦은 바인딩은 this를 효율적으로 사용하는 함수를 만들 수 있음

- 자신의 객체 문맥을 this로 얻는 메소드를 퍼블릭(public)메소드라고 부릅니다.



함수 호출 패턴

- 함수가 객체의 속성이 아닌 경우에는 함수로서 호출


- 함수 호출 패턴으로 호출할 때 this는 전역객체에 바인딩됨(설계 단계의 실수...)

- 대안을 사용해야함

   메소드에 변수를 정의한 후 여기에 this를 할당하고, 내부 함수는 이 변수를 통해서 메소드의 this에 접근하는 방법




생성자 호출 패턴

- 자바스크립트는 프로토타입에 의해 상속이 이루어지는 언어

- 이것은 객체가 자신의 속성들을 다른 객체에 바로 상속할 수 있다는 것을 뜻함

- 자바스크립트는 클래스가 없음


- 함수를 new 라는 전치 연산자와 함께 호출하면, 

  호출한 함수의 prototype 속성의 값에 연결되는 (숨겨진) 링크를 갖는 객체가 생성되고, 

  이 새로운 객체는 this에 바인딩

- new 라는 전치 연산자는 return 문장의 동작을 변경


- new라는 전치 연산자와 함께 사용하도록 만든 함수를 생성자(constructor)라고 함

일반적으로 생성자는 이니셜을 대문자로 표기(파스칼)

- 생성자를 new 없이 호출시, 컴파일 시간이나 실행시간에 어떤 경고도 없어서 알 수 없는 결과를 초래

- 생성자 함수를 사용하는 스타일은 권장 사항은 아님




apply 호출 패턴

- 자바스크립트는 함수형 객체지향 언어이기 때문에, 함수는 메소드를 가질 수 있음

- apply 메소드는 함수를 호출할 때 사용할 인수들의 배열을 받아들임

- this값을 선택할 수 있도록 해줌

- apply 메소드에는 2개의 매개변수 존재: this에 묶이게될 값, 매개변수들의 배열 





인수배열(arguments)

- 함수 호출 시, 추가적인 매개변수로 arguments라는 배열을 사용할 수 있음

- 함수를 호출할 때 전달된 모든 인수를 접글할 수 있게 함(매개변수 수보다 더 많이 전달된 인수들도 모두 포함)

- arguments라는 매개변수는 매개변수의 갯수를 정확히 정해놓지 않고, 

   넘어오는 인수의 갯수에 맞춰서 동작하는 함수를 만들 수 있게 함








Posted by croute

댓글을 달아 주세요

  1. BlogIcon 나그네 2013.10.02 11:52 신고  댓글주소  수정/삭제  댓글쓰기

    메소드 호출 패턴에서 저런 방식으로는 this로는 호출이 안됩니다.
    찾아보니까 this는 호출한 owner에 속한다고 합니다.

    console로 찍어보니,
    this는 window로 나오네요..
    한 번 실험해주시고 답변 주세요.

  2. BlogIcon 나그네 2013.10.02 11:55 신고  댓글주소  수정/삭제  댓글쓰기

    이런 방식은 된다고 하네요.

    var object = new Object();

    object.scope = "field";

    object.scopeCheck = function() { alert("(2) "+this.scope); }

    object.scopeCheck(); // 출력결과 예상