'일등 객체'란 무엇입니까?


답변:


179

위키 백과 를 인용하려면 :

컴퓨터 과학에서, 프로그래밍 언어는 함수를 일급 객체로 취급하는 경우 일급 함수 (또는 함수 리터럴)를 지원한다고합니다. 즉,이 언어는 프로그램 실행 중 새 함수 구성, 데이터 구조에 저장, 다른 함수에 대한 인수로 전달하고 다른 함수의 값으로 리턴하는 기능을 지원합니다.

이 페이지는 또한 그것을 아름답게 보여줍니다 :

다른 변수와 마찬가지로

  • 함수는 객체 유형의 인스턴스입니다
  • 함수는 속성을 가질 수 있고 생성자 메서드에 대한 링크를 가지고 있습니다
  • 함수를 변수에 저장할 수 있습니다
  • 함수를 다른 함수에 매개 변수로 전달할 수 있습니다
  • 함수에서 함수를 반환 할 수 있습니다

또한 TrayMan의 의견을 읽으십시오. 흥미로운 ...


11
wikipedia를 인용하는 것은 멋지고 멋지지만 설명은 괴짜가 아닌 과학자를위한 언어로 작성되었습니다. 도대체 그게 무슨 뜻입니까? 그 인용문의 마지막 문장은 모호하다.
Spoike 2009

1
@Spoike, true ... 제공된 자바 스크립트 리소스
Sander Versluys 2009

16
편리하게도 일급 함수를 가진 언어는 일차 함수를 배제하는 일차 함수로 제한되는 것과 달리 고차 함수를 갖습니다. (고급이지만 일류는 불가능합니다.)
TrayMan

5
나는 Wikipedia 인용에서 분명하지 않은 것을 발견했지만 추가 링크는 훌륭합니다.
ProfK 2009

4
링크가 더 이상 작동하지 않습니다 (8 년 후).
doubleOrt

47

영국의 컴퓨터 과학자 인 크리스토퍼 스트라 쉐 (Christopher Strachey )는 1960 년대에 프로그래밍 언어에서 "일류 함수" 라는 개념을 도입했습니다 . 이 원칙의 가장 유명한 공식은 Gerald Jay Sussman과 Harry Abelson 의 컴퓨터 프로그램 구조 및 해석에 있습니다 .

  • 변수로 이름을 지정할 수 있습니다.
  • 그것들은 절차에 대한 논쟁으로 전달 될 수 있습니다.
  • 절차 결과로 반환 될 수 있습니다.
  • 그것들은 데이터 구조에 포함될 수 있습니다.

기본적으로 이는 프로그래밍 언어의 다른 모든 요소로 수행 할 수있는 모든 기능을 함수로 수행 할 수 있음을 의미합니다. 따라서 JavaScript의 경우 Integer, String, Array 또는 다른 종류의 Object로 수행 할 수 있는 모든 기능을 함수로 수행 할 수 있습니다 .


14

Strachey-Sussman-Abelson의 제제에 대한보다 완벽한 승인. 따라서 언어가 이러한 구문을 지원하면 일급 언어로 기능을 사용할 수 있습니다 :)

var men = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
men.isSweetHeart = true;

var women = function (objectOfAdmiration) {
  return objectOfAdmiration();
};
women.isSweetHeart = true;

var aliens = function (objectOfAdmiration) {
  return objectOfAdmiration();
};

function like(obj){
  if (obj.isSweetHeart) {
      return function (){ return "Holy TRUE!"}; 
  }
  else {
      return function (){ return "Holy CRAP!"};
  }
}

alert("Men like women is " + men(like(women))); // -> "Holly TRUE!"
alert("Women like men is " + women(like(men))); // -> "Holly TRUE!"

alert("Men like aliens is " + men(like(aliens))); // -> "Holly CRAP!"
alert("Aliens like women is " + aliens(like(women))); // -> "Holly TRUE!" :)

//women(like(aliens)); //  Who knows? Life is sometimes so unpredictable... :)

요컨대, 언어에서 객체의 상태 조작 종류 또는 객체 유형으로 작동하는 경우 모든 것이 일류 객체입니다. 단순히 작업하고 문장을 전달하고 동시에 표현으로 평가할 수있는 것입니다. 또는 더 짧게 : 함수를 추가로 호출 할 수있는 객체로 생각할 수있을 때.


9

JavaScript 함수는 함수와 객체가 같은 것으로 취급되는 것을 의미하는 일급 함수입니다. 함수는 객체 또는 배열 내부에 변수로 저장 될 수있을뿐만 아니라 인수로 전달되거나 다른 함수에 의해 반환 될 수 있습니다. 그 기능을 "JavaScript의 일급 시민"으로 만듭니다

JavaScript는 리터럴 표기법 구문을 사용하므로 JavaScript 함수에서 객체라는 사실을 완전히 이해하기 어렵습니다.

예를 들어 ..

var youObj1 = new Object();
// or
var youObj1 = {};

두 편차는 동일합니다. 사용하여new Object의 생성자 함수를 호출합니다. 또한 {}(리터럴이라고하는 JavaScript 바로 가기)를 사용하여 Object의 생성 함수를 호출합니다. {}생성자를 인스턴스화하기위한 짧은 표현입니다.

대부분의 언어는 new 키워드를 사용하여 객체를 생성하므로 JavaScript 객체를 생성 할 수 있습니다.

var myFunction = new Function("a",  "b", 'return a_b');

보시다시피 우리는 객체 이름 함수를 만들었습니다 .

JavaScript 함수 표현식을 사용하여 동일한 오브젝트 이름 함수 작성 ..

var myFunction = function myFunction(a,b) {
    return a+b;
}

이제 객체 이름 함수를 만들었습니다.


9

자바 스크립트에서 함수는 객체가 할 수있는 것보다 더 많은 것을 할 수 있기 때문에 일류 객체입니다.

  • 함수는 객체 유형의 인스턴스입니다.

Function instanceof Object //returns true

객체와 마찬가지로 함수는 속성을 가질 수 있고 생성자 함수에 대한 링크를 가질 수 있습니다.

 var o = {}; // empty object 'o'
    o.a = 1 ; 
    o.b = 2 ; 

    console.log(o.a); // 1
    console.log(o.b); // 2 


    function foo(){};
    foo.a = 3 ; 
    foo.b = 4 ; 

    console.log(foo.a);  // logs 3
    console.log(foo.b);  // logs 4 

  • 함수는 값으로 변수에 저장 될 수 있습니다.

  var foo = function(){}; 
    console.log(foo); // function(){}

  • 함수는 다른 함수에 인수로 전달 될 수 있습니다

function callback (foo){
      foo();
}

callback(function(){console.log('Successfuly invoked as an argument inside function callback')})

  • 함수에서 함수를 반환 할 수 있습니다

 function foo(){
	    return function(){console.log('working!')};
    }

    var bar = foo();
    bar(); // working!

  • 변수로 참조로 저장할 수 있습니다.

    var sum = function (a,b){return a+b}  
    sum(4,4);


객체는 모든 것을 할 수 있습니다.
doubleOrt

5

간단한 테스트. 귀하의 언어로 이것을 할 수 있다면 (예를 들어 Python) :

def double(x):
    return x*x

f = double

print f(5) #prints 25

귀하의 언어는 함수를 일급 객체로 취급합니다.


3
그러나 C ++ 에서이 작업을 수행 할 수 있습니다 : int twice (int x) {return x << 1; } int (* f) (int) = 두 번; std :: cout << (* f) (5) << std :: endl; 이것이 C ++이 함수를 퍼스트 클래스 객체 (재미있는 구문)로 취급한다는 의미입니까?
Thomas L Holaday 2009

1
함수 안에 함수를 만들 수있을 때까지, 아니오라고 말하고 싶습니다.
cHao

1
C 함수 포인터는 퍼스트 클래스 함수 (매우 제한된 정의)를 지원하지만 함수는 객체가 아닙니다. C의 함수 포인터는 상태 나 동작을 포함하지 않습니다.
Steven Kramer

2

그것은 함수가 유형과 행동을 가진 객체라는 것을 의미합니다. 그것들은 동적으로 만들어지고 다른 객체처럼 전달 될 수 있으며, 호출 될 수 있다는 사실은 인터페이스의 일부입니다.


2

함수가 실제로 Object에서 상속 함을 의미합니다. 그것을 전달하고 다른 객체와 같이 사용할 수 있습니다.

그러나 C #에서는 함수를 가지고 놀기 위해 델리게이트 나 리플렉션을 삼가야합니다. (이것은 최근 람다 식으로 훨씬 좋아졌습니다)


2

모질라 사이트에 대한 정의는 간결하고 명확합니다. 그들에 따르면,

JavaScript에서 함수는 다른 객체와 마찬가지로 속성과 메서드를 가질 수 있기 때문에 일류 객체 입니다. 다른 객체와 구별되는 것은 함수를 호출 할 수 있다는 것입니다. 간단히 말해서 그것들은 Function 객체입니다.

함수는 함수의 외부 (또는 재귀의 경우 내부) 코드로 호출 할 수있는 "서브 프로그램"입니다. 프로그램 자체와 마찬가지로 함수는 함수 본문이라고하는 일련의 명령문으로 구성됩니다. 값은 함수에 전달 될 수 있으며 함수는 값을 반환합니다.


0

언어에서 첫 번째 클래스가 될 때 라이브러리 또는 구문 설탕이 아닌 구문으로 지원된다는 것을 의미합니다. 예를 들어 C의 클래스는 첫 번째 클래스가 아닙니다.


0

JavaScript에서 간단하게 함수는 1 급 객체입니다. 즉, 함수는 Object 유형이며 실제로는 객체이므로 다른 객체 (String, Array, Number 등)와 같은 1 급 방식으로 사용할 수 있습니다. 그들 자신. 그것들은“변수에 저장되고, 함수에 인수로 전달되고, 함수 내에서 생성되고, 함수에서 반환 될 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.