“第一类对象”是什么意思?

最近的问题中,我收到了一些建议,其中包括谈论 JavaScript 中函数是“第一类”对象的方面。与其他对象相比,“第一类”在这个上下文中意味着什么?

编辑(Jörg W Mittag) : 完全复制: “什么是一级编程构造?”

72333 次浏览

引用 维基百科的话:

在计算机科学中,编程 据说语言支持 第一类函数(或函数) 如果它将函数视为 一流的对象,具体来说, 这意味着语言支持 构造新函数 执行程序,存储它们 在数据结构中,将它们作为 其他函数的参数,以及 返回它们作为其他 功能。

这一页也 说明它美丽:

真的,就像其他变量一样

  • 函数是 Object 类型的实例
  • 函数可以具有属性并具有指向其构造函数方法的链接
  • 可以将函数存储在变量中
  • 可以将函数作为参数传递给另一个函数
  • 可以从函数返回函数

也读了 TrayMan 的评论,有意思..。

它意味着函数是具有类型和行为的对象。它们可以动态构建,作为任何其他对象传递,并且可以调用它们的事实是它们接口的一部分。

这意味着函数实际上是从 Object 继承的。这样你就可以像处理其他对象一样传递和处理它。

然而,在 c # 中,您需要避免委托或反射来处理函数。(最近使用 lambda 表达式时,这种情况要好得多)

我猜当某个东西是语言中的第一类时,这意味着它是由语法支持的,而不是由库或者语法糖来支持的。例如,C 语言中的类不是一流的

简单的测试。如果你能用你的语言做到这一点(例如 Python) :

def double(x):
return x*x


f = double


print f(5) #prints 25

您的语言将函数视为第一类对象。

“一级函数”在编程语言中的概念是由英国计算机科学家 克里斯托弗·斯特雷奇在20世纪60年代提出的。这个原理最著名的公式可能是杰拉德·杰伊·萨斯曼和哈里•阿贝尔森(harryabelson)在 计算机程序的构造和解释中提出的:

  • 它们可以由变量命名。
  • 它们可以作为参数传递给过程。
  • 它们可以作为程序的结果返回。
  • 它们可能包含在数据结构中。

基本上,它意味着您可以对函数执行编程语言中所有其他元素所能执行的任何操作。因此,对于 JavaScript 来说,这意味着您可以使用 Integer、 String、 Array 或任何其他类型的 Object 来完成所有事情,您可以使用函数来完成 还有

对斯特雷奇-萨斯曼-阿贝尔森配方的完全认可。因此,如果您的语言支持这样的结构,那么您就得到了 作为一级函数语言:)

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

简而言之,如果任何东西在语言中作为某种对象或对象类型的状态操作,那么它就是一个第一类物件。简单来说,就是您可以操作、传递语句并同时在表达式中求值。 或者更短: 当您可以将函数视为一个可以额外调用的对象时。

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;
}

我们刚刚创建了一个对象名称函数。

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

  • 函数是 Object 类型的实例。

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);

在 JavaScript 中,函数是第一类对象,也就是说,函数是 Object 类型的,它们可以像任何其他对象(String、 Array、 Number 等)一样以第一类的方式使用,因为它们实际上是对象本身。它们可以“存储在变量中,作为参数传递给函数,在函数中创建,并从函数中返回

Mozilla 站点的定义简洁明了,

在 JavaScript 中,函数是第一类对象 因为它们可以像其他对象一样拥有属性和方法。它们与其他对象的区别在于可以调用函数。简而言之,它们是 Function 对象。

还有

函数是一个“子程序”,可以由函数的外部(或递归情况下的内部)代码调用。与程序本身一样,函数也由一系列称为函数体的语句组成。值可以传递给函数,函数将返回一个值。