“一流对象”是什么意思?


Answers:


179

引用维基百科

在计算机科学中,如果将编程语言视为一类对象,则该编程语言被称为支持一类函数(或函数文字)。具体来说,这意味着该语言支持在程序执行期间构造新函数,将它们存储在数据结构中,将它们作为参数传递给其他函数以及将它们作为其他函数的值返回。

此页面还对它进行了漂亮的说明

真的,就像其他变量一样

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

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


11
引用维基百科既好又花花公子,但其描述是针对科学家而不是极客的语言编写的。这到底意味着什么呢?该引号中的最后一句话是vagu。
Spoike

1
@Spoike,是的。。。提供了javascript资源。
Sander Versluys,2009年

16
方便的是,具有一类功能的语言也具有高阶功能,而不是局限于一阶功能,后者会排除一类功能。(尽管可能是高阶的,但不是一流的。)
TrayMan

5
我在Wikipedia报价中没有发现任何不清楚的地方,但是附加链接非常好。
ProfK

4
链接不再起作用(大约8年后)。
doubleOrt

47

1960年代,英国计算机科学家克里斯托弗·斯特拉奇Christopher Strachey)提出了一种编程语言中的“一流功能”的概念。此原理最著名的提法可能是杰拉尔德·杰伊·萨斯曼和哈里·阿贝尔森撰写的《计算机程序结构和解释》

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

基本上,这意味着您可以使用函数来进行编程语言中所有其他元素可以做的所有事情。因此,在JavaScript的情况下,这意味着一切都可以用一个整数,字符串,数组或任何其他类型的对象做,你可以做功能。


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我们正在调用对象的构造函数。同样,通过使用{}(称为文字的JavaScript快捷方式),我们可以调用对象的构造函数。{}只是实例化构造函数的简短表示。

大多数语言使用new关键字创建对象,因此让我们创建一个JavaScript对象。

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

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

使用JavaScript函数表达式创建相同的对象名称函数。

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

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


9

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

  • 函数是对象类型的实例。

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 two(int x){return x << 1; } int(* f)(int)=两次;std :: cout <<(* f)(5)<< std :: endl; 这是否意味着C ++将函数视为一流的对象(语法很有趣)?
Thomas L Holaday

1
直到您可以在函数内创建函数,我要说不。
cHao 2010年

1
C函数指针支持(非常有限的定义)一流的函数,但函数不是对象。C语言中的函数指针不包含状态或行为。
史蒂文·克莱默

2

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


2

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

但是在c#中,您需要避免委托或反射来使用函数。(最近,使用lambda表达式会更好)


2

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

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

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


0

我想当某种东西在某种语言中是一流的时,这意味着它的语法而不是库或语法糖得到了支持。例如,C语言中的类不是第一类


0

函数在JavaScript中很简单,是一流的对象,也就是说,函数属于Object类型,并且它们可以像其他任何对象(String,Array,Number等)一样以一流的方式使用,因为它们实际上是对象他们自己。它们可以“存储在变量中,作为参数传递给函数,在函数内部创建,然后从函数返回”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.