2017-09-25 11 views
1

矢印の関数にはthisがありません。通常の関数に比べてかなり基本的な機能はありません。コンテキストを持たないため、コンストラクタとして使用することはできません。JavaScript:矢印関数はファーストクラスの関数ですか?

これを念頭に置いて、矢印機能はファーストクラスの機能と考えられていますか?

編集:矢印機能をファーストクラスの機能と見なしても、矢印機能のプロパティは何ですか?

答えて

1

矢印の機能にはこれがないので、通常の機能に比べてかなり基本的な機能がありません。コンテキストを持たないため、コンストラクタとして使用できません。

これは関数の実行であり、その型ではありません。 A thisの値は、関数オブジェクト自体ではなく、実行の側面です。

これを念頭に置いて、矢印機能はファーストクラスのオブジェクトと考えられますか?

はい、他のオブジェクトと同じようにデータオブジェクトであり、呼び出すことができる実行可能コードが含まれている点が異なります。彼らの呼び出しに関するさまざまな種類の関数の能力と限界は、それらがファーストクラスのオブジェクトであるかどうかには関係しません。

const fn = foo => foo + 42 
 
const fn2 = fn 
 

 
console.log(fn == fn2) // true 
 

 
console.log(fn(42)) 
 
console.log(fn2(42)) 
 

 
fn.foo = "bar" 
 
console.log(fn2.foo) // "bar"


編集:矢印関数がファーストクラスの機能と考えている場合、あなたはまだ1それを呼び出すことができるように矢印機能の性質は何ですか?

伝統的な機能のプロパティと同じです。それらはすべてFunction.prototypeから継承するオブジェクトです。彼らの主な違いは呼び出しであり、最初のクラスのオブジェクト/関数であるかどうかの問題は変わりません。 構文的にを他の場所で使用することもできます。他のオブジェクトを使用することもできます。

+0

@Andrew:これは全く異なる質問です。ある関数型を別の関数型と比較する前に、実際に質問する必要があります。基本的には、他のオブジェクトと同様に構文的にデータとして使用できるオブジェクトです。インタプリタ/コンパイラは、変数、関数パラメータ、または値を期待する他の構造体の値にしようとすると、構文エラーをスローしません。 Arrayと同様に、特別な種類のオブジェクト値です。関数も同様です。 – llama

+0

ええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええええと>この文をどのように解釈するのかは、コンストラクタとして使うことができないので、これは真実ではありません。少なくとも、適切には使用されません。矢印関数の 'this'はウィンドウ/グローバルオブジェクト(またはその上のスコープ)です。コンストラクタに関しては、望ましくない/間違っていても、機能の変更は無関係であると言っていますか? – Andrew

+0

@Andrew:これは構文上の問題ではありません。実行時の問題(TypeError)です。私が「構文的に」言うとき、例えば、if文を変数に代入しようとすると、パーザはSyntaxErrorをスローしません。 – llama

関連する問題