在最近的问题中,我收到了一些建议,以讨论除其他方面外,JavaScript是函数是“一流”对象的方面。与其他对象相比,“一流”在这种情况下是什么意思?
编辑(JörgW Mittag):完全重复:“什么是一流的编程结构?”
在最近的问题中,我收到了一些建议,以讨论除其他方面外,JavaScript是函数是“一流”对象的方面。与其他对象相比,“一流”在这种情况下是什么意思?
编辑(JörgW Mittag):完全重复:“什么是一流的编程结构?”
Answers:
引用维基百科:
在计算机科学中,如果将编程语言视为一类对象,则该编程语言被称为支持一类函数(或函数文字)。具体来说,这意味着该语言支持在程序执行期间构造新函数,将它们存储在数据结构中,将它们作为参数传递给其他函数以及将它们作为其他函数的值返回。
此页面还对它进行了漂亮的说明:
真的,就像其他变量一样
还读了TrayMan的评论,很有趣...
1960年代,英国计算机科学家克里斯托弗·斯特拉奇(Christopher Strachey)提出了一种编程语言中的“一流功能”的概念。此原理最著名的提法可能是杰拉尔德·杰伊·萨斯曼和哈里·阿贝尔森撰写的《计算机程序的结构和解释》:
基本上,这意味着您可以使用函数来进行编程语言中所有其他元素可以做的所有事情。因此,在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
您的语言将函数视为一流的对象。