1.定期的な匿名関数の構文を定義します。
関数(X){ リターン X * X。 }
この機能2.矢印を使用してコードを1行だけを取得する機能を使用することができます!
X => X * X
矢印の機能と同等の無名関数、および関数の定義を簡素化します。
アロー関数は2つの形式があります。
- 一種の上記のように、それも、唯一の表現が含まれています
{
... }
し、return
省略されています。 - もう一つは、複数の文を含むことができ、今回は省略することができない
{ ... }
とreturn。
例えば:
X => { 場合(X> 0 ){ リターン X * X。 } 他{ リターン - X * X。 } }
関数の構文規則を矢印:
(パラメータ)=> {文}
全く機能パラメータまたはパラメータの複数を有していない場合は、次のように書くことができます。
戻り値は一つだけの式(式)がある場合、括弧は省略してもよいです。
// はパラメータない: ()=> 3.14 // パラメータ // 唯一のパラメータは括弧を省略することができる場合: X => X * X @ 二つのパラメータ: (X、Y)=> X * X + Yを* Yは// 可変パラメータ: (X、Y、... REST)=> { varは I、SUM = X + Y; のための(I = 0; Iはrest.lengthを<; Iは++ ){ SUM + = REST [I ]; } 戻りSUM; }
注意:あなたがオブジェクトを返すようにしたい場合は、我々は、単一の式ならば、それは文句を言うでしょう書くことに注意してください。
// にSyntaxError: X => {FOO:X}
身体機能およびので {...}構文の競合、それが変更されるべきです。
// OK: X =>({FOO:X})
これは、地元のバインドされていません
アロー機能は、速記匿名関数のように見えるが、実際には、矢印の機能と匿名関数は、明確な区別があります。矢印の内部関数はthis
レキシカルスコープは、文脈によって決定されます。アロー機能は結合しませんthis
。機能を矢印またはそれが変更されませんと述べたthis
オリジナルの結合。
例えば
機能カウンタ(){ この .num = 0 。 } VARの A = 新しいカウンタ()。 console.log(a.num)。// 0
キーワードの使用しているため 、新たな建設、中()関数をカウント 新しいオブジェクトにこのバインド、およびに割り当てられていますa
。ことで はconsole.log印刷 a.num、意志出力0。
我々は、すべてが第二渡したい場合は 値a.numプラス1を、どのようにそれを達成するには?あなたは使用することができ たsetInterval()関数を。
機能カウンタ(){ この .num = 0 。 この .timer =たsetInterval(機能追加(){ この .num ++ ; はconsole.log(この.num); }、 1000 )。 } VARの B = 新しいカウンタ()。 // NaNの // NaNの // NaNに // ...
すべての目は、あるだろうNaN
数字が蓄積するのではなく、プリントアウト。
理由は:まず、関数 のsetIntervalは使用しませんでした、宣言のオブジェクトと呼ばれていない 、その後のない使用がない、新しいキーワードを 、バインド 電話して 適用されます。 ただ通常の関数のsetInterval。実際 のsetIntervalの内側に 、このグローバルオブジェクトにバインドされています。
理由は、印刷 のNaN、ので this.numがにバインドされた ウィンドウオブジェクトの NUM、および window.num未定義。
ソリューション:矢印機能を使用してください!矢印機能は発生しません使用し 、これはグローバルオブジェクトにバインドされています。
機能カウンタ(){ この .num = 0 。 この .timer =たsetInterval(()=> { この .num ++ ; はconsole.log(この.num); }、 1000年)。 } VARの B = 新しいカウンタ()。 // 1 // 2 // 3 // ...
拘束カウンターコンストラクタ これは保持されます。 setInterval関数で、 これはまだ新しく作成をポイントしb
たオブジェクト。
別の例:
上のJavaScript関数ので、 この結合エラーハンドリング、次の例では、期待される結果を得ることができません。
VAR OBJ = { 誕生: 1990 、 getAge:関数(){ VARの B = この .birth。// 1990年 のvar FN = 機能(){ 返す 新しい)(日付のgetFullYear() - 。この .birth。// この指向ウィンドウ或未定義 }; リターンFN(); } }。
今、完全に矢印の機能復元 これにポインティングしている、 これは常に呼び出し側の外側の層であるレキシカルスコープ、を指す OBJ:
VAR OBJ = { 誕生: 1990 、 getAge:関数(){ VARの B = この .birth。// 1990年 のvar FN =()=> 新しい日付()のgetFullYear() - 。この .birth。// この指向OBJ对象 リターンFN(); } }。 obj.getAge(); // 25
あなたがハッキングの書き込みの種類の前に、矢印の機能を使用する場合:
VAR = この ;
それはもはや必要ありません。
以来this
、矢印機能がすでにレキシカルスコープに基づいてバインドされているので、使用の 呼び出し()または (あなたが矢印の関数を呼び出すとき、ない適用のために) このバウンド、それは最初の引数は無視されるに渡されます。
VAR OBJ = { 誕生: 1990 、 getAge:機能(年){ VARの B = この .birth。// 1990年 のvar FN =(Y)=> Y - この .birth。// this.birth仍是1990 リターン fn.call({誕生:2000 }、年); } }。 obj.getAge( 2015); // 25