在最近的一个问题中,我收到了一些建议,可以讨论 JavaScript 的函数是“一流”对象的方面。与其他对象相比,在这种情况下,“头等舱”是什么意思?
编辑(Jörg W Mittag):完全重复:“什么是一流的编程结构?”
在最近的一个问题中,我收到了一些建议,可以讨论 JavaScript 的函数是“一流”对象的方面。与其他对象相比,在这种情况下,“头等舱”是什么意思?
编辑(Jörg W Mittag):完全重复:“什么是一流的编程结构?”
编程语言中“一等函数”的概念是由英国计算机科学家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);
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;
}
在这里,我们刚刚创建了一个对象名称函数。