JavaScript初心者は必ず「矢印関数」を見ます.
4150 ワード
矢印関数は文法の変化にしか見えないが、原文:JavaScript:Arrow Functions for Beginner 翻訳者:Fundbug この文章は意訳を採用して、著作権は元の作者の所有になります.
本論文では矢印関数の利点を紹介します.
より簡潔な文法
まず、従来の文法で関数を定義します.
部分
一般的な関数とは異なり、矢印関数は
じゃ、私たちはどうやってこの問題を解決しますか?矢印関数を使用します.矢印関数を使用すると、
先ほどの表現を検証するために、矢印関数書き込みコードは、より簡潔な文法を有する. は Funebugについて
FunndebugはJavaScript、微信小プログラム、微信小ゲーム、支払宝小プログラム、React Native、Node.js、JavaオンラインでリアルタイムBUG監視を適用します.2016年に双十一が正式にオンラインしてから、Fundebugは累計で10億+エラー事件を処理しました.有料顧客はGoogle、360、金山軟件、庶民網など多くのブランド企業があります.皆さん、無料で試用してください.
著作権声明
転載する時、作者のFunebugと本文の住所を明記してください.https://blog.fundebug.com/2017/05/25/arrow-function-for-beginner/
this
の作用領域にも影響を与えている.本論文では矢印関数の利点を紹介します.
より簡潔な文法
まず、従来の文法で関数を定義します.
function funcName(params) {
return params + 2;
}
funcName(2);
// 4
この関数は矢印関数を使って、1行のコードだけで済ませることができます.var funcName = params => params + 2;
funcName(2);
// 4
かっこいいですか極端に簡潔な例ですが、コードを書く際の矢印関数の利点をよく表しています.矢印関数の文法を深く理解します.parameters => {
statements;
};
パラメータがない場合は、さらに簡略化することができる.() => {
statements;
};
パラメータが一つしかない場合は、括弧を省略できます.parameters => {
statements;
};
戻り値が1つの表式だけであれば、大かっこは省略できます.parameters => expression
// :
function (parameters){
return expression;
}
矢印の文法はもう覚えました.実戦でやりましょう.Chromeブラウザ開発者コンソールを開き、入力:var double = num => num * 2;
変数double
を矢印関数に結びつけ、この関数にはパラメータnum
があり、num * 2
を返します.この関数を呼び出す:double(2);
// 4
double(3);
// 6
行コード解決バグ監視:Funebug部分
this
のバインディングがありません.一般的な関数とは異なり、矢印関数は
this
をバインディングしない.または、矢印関数は、this
本来のバインディングを変更しない.一例を使って説明します.function Counter() {
this.num = 0;
}
var a = new Counter();
キーワードnew
を使用して構成されているので、Counter()関数のthis
は新しいオブジェクトに結合され、a
に値が与えられる.console.log
でa.num
を印刷すると、0が出力されます.console.log(a.num);
// 0
もし一秒ごとにa.num
の値をプラスしたいなら、どうやって実現しますか?setInterval()
関数が使用できます.function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
this.num++;
console.log(this.num);
}, 1000);
}
出力結果を見てみます.var b = new Counter();
// NaN
// NaN
// NaN
// ...
一秒ごとにNaN
という数字が印刷されています.いったいどこが間違っていますか?まず、次のようなステートメントを使用して、setInterval
関数の連続実行を停止します.clearInterval(b.timer);
なぜエラーが発生したのかを理解しようとします.前のブログで説明した規則によると、まず関数setInterval
はある声明の対象に呼び出されていません.new
キーワードも使用されていません.bind
、call
、apply
とsetInterval
を使用していません.setInterval
は普通の関数です.実際にはthis
の中のthis
は、大域オブジェクトに紐付けされている.window
をプリントアウトして確認できます.function Counter() {
this.num = 0;
this.timer = setInterval(function add() {
console.log(this);
}, 1000);
}
var b = new Counter();
NaN
オブジェクト全体がプリントされていることが分かります.次のコマンドで印刷を停止します.clearInterval(b.timer);
前の関数に戻ると、this.num
はwindow
オブジェクトのnum
にバインドされているため、window.num
は定義されていない.じゃ、私たちはどうやってこの問題を解決しますか?矢印関数を使用します.矢印関数を使用すると、
this
が大域オブジェクトにバインドされないようになります.function Counter() {
this.num = 0;
this.timer = setInterval(() => {
this.num++;
console.log(this.num);
}, 1000);
}
var b = new Counter();
// 1
// 2
// 3
// ...
Counter
コンストラクタによって結合されたthis
は保持されます.setInterval
関数において、this
は依然として私たちが新しく作成したb
オブジェクトを指す.先ほどの表現を検証するために、
Counter
関数のthis
をthat
に結びつけ、setInterval
においてthis
とthat
とが同じかどうかを判断することができる.function Counter() {
var that = this;
this.timer = setInterval(() => {
console.log(this === that);
}, 1000);
}
var b = new Counter();
// true
// true
// ...
私たちが望むように、プリント値は毎回true
です.最後に、スクリーン印刷を終了します.clearInterval(b.timer);
締め括りをつけるthis
をバインドしない.FunndebugはJavaScript、微信小プログラム、微信小ゲーム、支払宝小プログラム、React Native、Node.js、JavaオンラインでリアルタイムBUG監視を適用します.2016年に双十一が正式にオンラインしてから、Fundebugは累計で10億+エラー事件を処理しました.有料顧客はGoogle、360、金山軟件、庶民網など多くのブランド企業があります.皆さん、無料で試用してください.
著作権声明
転載する時、作者のFunebugと本文の住所を明記してください.https://blog.fundebug.com/2017/05/25/arrow-function-for-beginner/