で、最近の質問、私はとりわけ、上の話をする提案を受け、機能は「最初のクラスのオブジェクトではJavaScriptの様相。他のオブジェクトとは対照的に、このコンテキストでの「ファーストクラス」とはどういう意味ですか?
編集(JörgW Mittag):完全な重複:「ファーストクラスのプログラミング構成とは何ですか?」
で、最近の質問、私はとりわけ、上の話をする提案を受け、機能は「最初のクラスのオブジェクトではJavaScriptの様相。他のオブジェクトとは対照的に、このコンテキストでの「ファーストクラス」とはどういう意味ですか?
編集(JörgW Mittag):完全な重複:「ファーストクラスのプログラミング構成とは何ですか?」
回答:
ウィキペディアを引用するには:
コンピュータサイエンスでは、プログラミング言語は、関数をファーストクラスのオブジェクトとして扱う場合、ファーストクラスの関数(または関数リテラル)をサポートすると言われています。具体的には、プログラムの実行中に新しい関数を作成し、データ構造に保存し、引数として他の関数に渡し、他の関数の値として返すことを言語がサポートしていることを意味します。
このページはまたそれを美しく示しています:
本当に、他の変数と同じように
TrayManのコメントも読んでください。興味深い...
プログラミング言語における「ファーストクラス関数」の概念は、1960年代にイギリスのコンピューター科学者クリストファー・ストレーキーによって導入されました。この原理の最も有名な定式化は、おそらく、ジェラルド・ジェイ・サスマンとハリー・アベルソンによるコンピュータプログラムの構造と解釈にあります。
基本的に、それはプログラミング言語の他のすべての要素で実行できるすべてのことを関数で実行できることを意味します。つまり、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 = {};
両方のdeclerationは同等です。を使用し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
あなたの言語は関数をファーストクラスのオブジェクトとして扱っています。