什么是“头等客体”?

在最近的一个问题中 ,我收到了一些build议,其中包括JavaScript的function是“一stream”对象的方面。 在这种情况下,“第一类”是什么意思,而不是其他的对象?

编辑(JörgW Mittag):确切的重复: “什么是一stream的编程结构?

引用维基百科 :

在计算机科学中,如果一种编程语言把function当作第一类对象,就被认为是支持一streamfunction(或function文字)的。 具体来说,这意味着语言支持在程序执行过程中构造新的函数,将它们存储在数据结构中,将它们作为parameter passing给其他函数,并作为其他函数的值返回。

这个页面也很好地说明了这一点:

真的,就像其他variables一样

  • 一个函数是对象types的一个实例
  • 一个函数可以有属性,并有一个链接回到它的构造函数方法
  • 您可以将该函数存储在一个variables中
  • 您可以将该函数作为parameter passing给另一个函数
  • 您可以从函数返回函数

还读了TrayMan的评论,有趣的…

英国计算机科学家克里斯托弗·斯特拉奇 ( Christopher Strachey)在20世纪60年代提出了编程语言中“一streamfunction”的概念。 这个原则的最着名的表述可能是Gerald Jay Sussman和Harry Abelson 在“计算机程序的结构和解释”

  • 他们可能会被variables命名。
  • 他们可能会被作为parameter passing给程序。
  • 他们可能会作为程序的结果返回。
  • 它们可能包含在数据结构中。

基本上,这意味着您可以使用编程语言中的所有其他元素来执行所有function。 所以,在JavaScript的情况下,这意味着您可以使用整数,string,数组或任何其他types的对象执行的所有操作都可以使用函数。

对Strachey-Sussman-Abelson公式的更完整的批准。 所以如果你的语言支持这样的结构,那么你已经有了一个function,作为一stream的语言:)

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... :) 

简而言之,任何事物都是一stream的对象,如果它以语言的forms作为对象或对象types的状态操作types。 只需简单地操作一下,就可以同时传递语句和expression式。 甚至更短:当你可以把一个函数想象成一个可以额外调用的对象时。

JavaScript函数是一类函数,意味着函数和对象被视为相同的东西。 函数可以作为variables存储在对象或数组中,也可以作为parameter passing或由其他函数返回。 这使得“JavaScript中的一等公民”

JavaScript使用文字符号语法,这使得很难完全掌握JavaScript函数中的对象。

例如..

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

这两个错误是相同的。 通过使用new我们正在调用一个对象的构造函数。 另外通过使用{} (JavaScript快捷方式称为文字),我们正在调用一个对象的构造函数。 {}只是实例化构造函数的一个较短的表示forms。

大多数语言使用new关键字来创build一个对象,所以让我们创build一个JavaScript对象。

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

如您所见,我们创build了一个对象名称函数

使用JavaScript函数expression式创build相同的对象名称函数

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

在这里我们去我们刚刚创build的对象名称函数。

在JavaScript函数是第一类对象,因为它可以做比对象可以做的更多。

  • 一个函数是对象types的一个实例。

Function instanceof Object //returns true

就像一个对象,一个函数可以有属性,并且可以有一个链接回到它的构造函数。

  var o = {}; // empty object 'o' oa = 1 ; ob = 2 ; console.log(oa); // 1 console.log(ob); // 2 function foo(){}; foo.a = 3 ; foo.b = 4 ; console.log(foo.a); // logs 3 console.log(foo.b); // logs 4 

简单的testing。 如果你可以用你的语言来做到这一点(以Python为例):

 def double(x): return x*x f = double print f(5) #prints 25 

你的语言被视为第一类对象的function。

这意味着函数是对象,具有types和行为。 它们可以dynamic构build,像其他任何对象一样传递,而且可以调用它们是它们接口的一部分。

这意味着函数实际上是从Objectinheritance的。 所以你可以把它传递给它,并像其他任何对象一样使用它。

在c#中,但是你需要避免委托或反思玩弄function。 (这最近用lambdaexpression式好多了)

我猜什么时候什么东西是语言的第一类,这意味着它的语法支持,而不是一个库或语法糖。 例如,C中的类不是一stream的