矢印矢印目的球機能

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オリジナルの結合。

例えば

機能カウンタ(){
   この .nu​​m = 0 
} 
VARの A = 新しいカウンタ()。
 console.log(a.num)。// 0

キーワードの使用しているため  、新たな建設、中()関数をカウント  新しいオブジェクトにこのバインド、およびに割り当てられていますaことで  はconsole.log印刷  a.num、意志出力0。

我々は、すべてが第二渡したい場合は  値a.numプラス1を、どのようにそれを達成するには?あなたは使用することができ  たsetInterval()関数を。

機能カウンタ(){
   この .nu​​m = 0 この .timer =たsetInterval(機能追加(){
     この .nu​​m ++ ; 
    はconsole.log(この.nu​​m); 
  }、 1000 )。
} 

VARの B = 新しいカウンタ()。
// NaNの
// NaNの
// NaNに
// ...

すべての目は、あるだろうNaN数字が蓄積するのではなく、プリントアウト。

理由は:まず、関数  のsetIntervalは使用しませんでした、宣言のオブジェクトと呼ばれていない  、その後のない使用がない、新しいキーワードを  、バインド   電話して  適用されます。 ただ通常の関数のsetInterval。実際  のsetIntervalの内側に  、このグローバルオブジェクトにバインドされています。

理由は、印刷  のNaN、ので  this.numがにバインドされた  ウィンドウオブジェクトの  NUM、および  window.num未定義。

ソリューション:矢印機能を使用してください!矢印機能は発生しません使用し  、これはグローバルオブジェクトにバインドされています。

機能カウンタ(){
   この .nu​​m = 0 この .timer =たsetInterval(()=> {
     この .nu​​m ++ ; 
    はconsole.log(この.nu​​m); 
  }、 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

 

おすすめ

転載: www.cnblogs.com/chenxi188/p/11741825.html