什么是“头等客体”?
在最近的一个问题中 ,我收到了一些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的