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

2020/11/13 09:22 · javascript ·  · 0评论

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

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

引用维基百科

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

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

真的,就像其他变量一样

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

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

1960年代,英国计算机科学家克里斯托弗·斯特拉奇Christopher Strachey)提出了一种编程语言中“一流功能”的概念该原则最著名的表述可能是杰拉尔德·杰伊·萨斯曼(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函数是一流的函数,这意味着函数和对象被视为同一对象。函数可以作为变量存储在对象或数组中,也可以作为参数传递或由其他函数返回。这使函数成为“ 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;
}

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

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

简单的测试。如果可以用您的语言(例如Python)执行此操作:

def double(x):
    return x*x

f = double

print f(5) #prints 25

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

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

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

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

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

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

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

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

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

本文地址:http://javascript.askforanswer.com/yiliuduixiangshishenmeyisi.html
文章标签:
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!