• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

함수와 메소드의 관계에 대해 질문드립니다!

20.07.13 22:09 작성 조회수 100

1

몰입! 자바스크립트 질문입니다!

139페이지의 '함수와 메소드'파트에서

'함수는 오브젝트에 속해야 하며'라는 표현이 있고,

160페이지의 '함수와 메소드 차이'파트에서

'Object에 연결된 프로퍼티에서 값 타입이 function인 것을 함수라고 부르며, 

Object.prototype에 연결된 프로퍼티에서 값 타입이 function인 것을 메소드라고 부릅니다.

이 기준은 자바스크립트의 모든 네이티브 오브젝트에 적용됩니다.'

라는 표현이 있습니다.

그런데 172 페이지를 읽다 보니

'글로벌 오브젝트는 new연산자로 오브젝트를 생성할 수 없으므로 메소드가 아닌 함수입니다.'

라는 표현이 있어 잘 이해가 되지 않습니다.

글로벌 오브젝트는 브라우저가 자바스크립트 실행 환경을 만드는 '렌더링'단계에서 만들어지는 빌트인 오브젝트 중 하나이고, 빌트인 오브젝트는 네이티브 오브젝트이니 앞서 160페이지에서 언급해주신 표현이 적용될 것 같은데요.

그러면 글로벌 오브젝트에 속한 프로퍼티에서 값 타입이 function인 것을 함수라고 부르는 것이 맞지 않나요?

글로벌 오브젝트라는 오브젝트 자체를 함수로 부를 수 있는 건지? 궁금합니다.

왜냐하면 저술해주신 대로 글로벌 오브젝트는 모든 프로그램을 통틀어 단 하나 존재하는, 가장 상위의 오브젝트이기 때문에 어떤 오브젝트의 프로퍼티일 수도 없는 것이니, 어떤 오브젝트의 함수일 수도 없는 것이 아닌가 생각이 듭니다.

어떤 부분에서 놓치고 있는지 알려주시면 감사하겠습니다 ㅠㅠ

답변 2

·

답변을 작성해보세요.

1

추가: ES6에서는 엔진 개발사에서 겉으로 표시되지 않는 글로벌 오브젝트를 가져가고 있습니다. 글로벌 오브젝트라는 이름으로 접근할 수는 없지만, 크롬 브라우저의 경우 const 변수, let 변수를 Window 오브젝트에 설정하지 않고 글로벌 오브젝트에 설정하는 형태를 취하고 있습니다. 

1

'글로벌 오브젝트는 new연산자로 오브젝트를 생성할 수 없으므로 메소드가 아닌 함수입니다.' 라는 표현이 있어 잘 이해가 되지 않습니다. 
==> 글로벌 오브젝트는 하나만 존재하므로(존재해야 하므로) new 연산자로 인스턴스를 생성할 수 없다는 뜻입니다. new 연산자를 사용하려면 생성자 함수가 필요합니다만, 글로벌 오브젝트는 실체가 없으므로 인스턴스를 생성할 수가 없습니다.
한편, 스펙에서 글로벌 오브젝트에 prototype 사용 여부를 엔진 개발사에 일임했습니다. 이것은 엔진 개발사에서 내부적으로 가상의 글로벌 오브젝트를 가져갈 때 가능성이 있습니다. 글로벌 오브젝트에 prototype을 연결하더라도 인스턴스를 생성할 수는 없습니다.

----------------
그러면 글로벌 오브젝트에 속한 프로퍼티에서 값 타입이 function인 것을 함수라고 부르는 것이 맞지 않나요?
==>함수라고 부르는 것이 맞습니다.
----------------

글로벌 오브젝트라는 오브젝트 자체를 함수로 부를 수 있는 건지? 궁금합니다.
==> 글로벌 오브젝트는 오브젝트 이름이므로 함수로 부를 수 없습니다. 어떤 오브젝트에도 속하지 않는 함수를 작성하면 글로벌 오브젝트의 함수가 됩니다. 단, 글로벌 오브젝트는  이름만 있고 실체(오브젝트)가 없으므로 Window 오브젝트에 설정됩니다.