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

IT技术 javascript
2021-01-10 01:39:09

最近的一个问题中,我收到了一些建议,可以讨论 JavaScript 的函数是“一流”对象的方面。与其他对象相比,在这种情况下,“头等舱”是什么意思?

编辑(Jörg W Mittag):完全重复:“什么是一流的编程结构?”

6个回答

引用维基百科

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

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

真的,就像任何其他变量一样

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

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

@doubleOrt——你可以在wayback机器上找到链接:web.archive.org/web/20190419174030/http : //helephant.com/2008/08/...
2021-03-13 01:39:09
该链接不再有效(大约 8 年后)。
2021-03-31 01:39:09
方便的是,具有一等函数的语言也具有高阶函数,而不是仅限于一阶函数,这会排除一等函数。(虽然更高阶,但不是一流的。)
2021-04-05 01:39:09
引用维基百科很好而且很花哨,但描述是用科学家而不是极客的语言写的。这到底是什么意思?该引文中的最后一句话是 vagu。
2021-04-09 01:39:09
@Spoike,真的...提供了 javascript 资源。
2021-04-10 01:39:09

编程语言“一等函数”的概念是由英国计算机科学家Christopher Strachey在 1960 年代引入的这一原则最著名的表述可能是 Gerald Jay Sussman 和 Harry Abelson在计算机程序结构和解释中

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

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

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

简而言之,如果任何东西在语言中充当状态操作类对象或对象类型,那么它就是一流的对象。只是您可以操作和传递语句并同时在表达式中计算的东西。或者更短:当您可以将函数视为可以额外调用的对象时。

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

一个对象也可以做到这一切。
2021-03-24 01:39:09

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

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