“头等对象”是什么意思?

时间:2009-04-01 12:00:20

标签: javascript

recent question中,我收到了一些建议,其中包括JavaScript的方面,其中函数是“第一类”对象。与其他对象相比,“第一类”在这种情况下意味着什么?

EDIT(JörgWMittag):完全重复:"What is a first class programming construct?"

11 个答案:

答案 0 :(得分:162)

引用Wikipedia

  

在计算机科学中,编程   据说语言支持   一流的功能(或功能   如果它将函数视为   一流的物体。特别,   这意味着该语言支持   在这期间建立新的职能   执行程序,存储它们   在数据结构中,将它们作为   其他函数的参数,和   将它们作为其他的值返回   功能

此页面也illustrates非常漂亮:

  

真的,就像任何其他变量

一样
  • 函数是对象类型的实例
  • 函数可以具有属性,并且具有返回其构造函数方法的链接
  • 您可以将该功能存储在变量
  • 您可以将该功能作为参数传递给另一个功能
  • 您可以从函数
  • 返回该函数

还阅读了TrayMan的评论,有趣......

答案 1 :(得分:42)

编程语言中"first-class functions"的概念是由英国计算机科学家Christopher Strachey在20世纪60年代引入的。 Gerald Jay Sussman和Harry Abelson可能在Structure and Interpretation of Computer Programs中提出了这一原则的最着名的表述:

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

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

答案 2 :(得分:13)

更完整地批准了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... :)

简而言之,如果它在语言中作为状态操作类对象或对象类型起作用,则任何东西都是第一类对象。只需要您可以操作并传递语句并同时在表达式中进行评估。 甚至更短:当你可以将一个函数视为可以另外调用的对象时。

答案 3 :(得分: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;
}

我们在这里创建一个对象名称函数。

答案 4 :(得分:8)

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




答案 5 :(得分:5)

简单测试。如果你能用你的语言(例如Python):

def double(x):
    return x*x

f = double

print f(5) #prints 25

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

这意味着函数实际上是从Object继承的。因此,您可以传递它并像使用任何其他对象一样使用它。

在c#中,你需要避免委托或反思来使用函数。 (最近使用lambda表达式得到了更好的效果)

答案 8 :(得分:1)

Mozilla网站上的定义简洁明了。据他们说,

  

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

  

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

答案 9 :(得分:0)

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

答案 10 :(得分:0)

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