JavaScript矢印関数の詳細な理解。 ES6 Arrow構文の使用方法と、コードで矢印関数を使用する際に注意するためのいくつかの一般的な間違いを示します。それがどのように機能するかを示す多くの例を見るでしょう。
ECMAScript 2015(ES6とも呼ばれる)のリリース後、JavaScript Arrow関数が表示されました。簡潔な構文と
キーワードの処理方法のおかげで、矢印関数はすぐに開発者のお気に入りの機能の1つになりました。 this
function
、{}
キーワードを排除することにより、JavaScriptの簡潔な構文を提供します。 return
this
矢印関数は、特にオブジェクトのメソッドまたはthis
コンストラクターを使用する場合、すべてのケースに適していませんfunction
this
arguments
、.map()
、.sort()
、.forEach()
、.filter()
、.reduce()
、関数は、アクションの実行や値の返却など、プログラムで必要なことを達成するために有用な指示を保存できるレシピのようなものです。関数を呼び出すことにより、レシピに含まれる手順を実行できます。レシピを何度も書き直さずに、関数を呼び出すたびにこれを行うことができます。
以下は、関数を宣言し、JavaScriptで呼び出す標準的な方法です。
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
次のように関数式と同じ関数を記述することもできます。
const sayHiStranger = function () { return 'Hi, stranger!' }
利点には次のものが含まれます
function
キーワードreturn
キーワード{}
javascriptでは、関数は「ファーストクラスの市民」です。関数を変数に保存し、引数として他の関数に渡し、他の関数から値として返すことができます。 JavaScript Arrow関数でこれらすべてを実行できます。
上記の例では、関数にはパラメーターがありません。この場合、太った矢印(=>)シンボルの前に空の括弧()のセットを追加する必要があります。これは、複数のパラメーターを持つ関数を作成する場合にも当てはまります。
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
const sayHiStranger = function () { return 'Hi, stranger!' }
できるからといって、それはあなたがすべきであるという意味ではありません。気楽で心の優しい風刺により、カイル・シンプソン(「You Do n't Know JS」の著者)は、このフローチャートにブラケットを省略することについて彼の考えを置きました。 (フローチャートはここに挿入する必要がありますが、写真を直接挿入できないため、ここで省略されています)
const sayHiStranger = () => 'Hi, stranger'
暗黙のリターン
return
上記の例で、これらのきちんとしたコードの行がどのように機能するかを見たばかりです。参照のみの別の例を挙げましょう。 Orderbylikes()関数の関数はその名前です。
そこで何が起こったのですか?通常の関数の構文を使用してみてください:
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
これで、外部関数Greeterがパラメーターの挨拶をし、匿名関数を返す方法をすばやく理解できます。次に、この内部関数には名前という名前のパラメーターがあり、挨拶と名前の値を使用して文字列を返します。これが関数を呼び出す方法です:
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
これらの暗黙の返品エラー
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
JavaScript Arrow関数に複数のステートメントが含まれている場合、すべてのステートメントをCurly Bracesに囲み、
キーワードを使用する必要があります。// 使用JS sort()函数按点赞数降序排列标题(点赞数越多,排名越高,点赞数越少,排名越低) const orderByLikes = netflixSeries.sort( (a, b) => b.likes - a.likes ) // 调用函数 // 输出:按降序排列的标题和点赞数 console.log(orderByLikes)
return
また、巻き毛の装具を使用しているため、暗黙のリターンは選択肢ではありません。
キーワードを使用する必要があります。const greeter = greeting => name => `${greeting}, ${name}!`
関数暗黙の返品を使用してリテラルをリテラルに戻す場合、括弧内にオブジェクトを囲む必要があります。 JavaScriptエンジンがオブジェクトのブレースを文字通り関数のブレースに誤って解析するため、そうしないとエラーが発生します。上記で気づいたように、矢印関数で巻き毛のブレースを使用する場合、キーワードを省略することはできません。 return
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
匿名関数function
と呼ばれます。通常の匿名関数式がどのように見えるかは次のとおりです。
矢印関数はすべて匿名関数です:
const sayHiStranger = function () { return 'Hi, stranger!' }
属性を使用して、構文位置に基づいて匿名関数の名前を推測できます。これにより、その値をチェックしたり、エラーを報告したりするときに関数を認識できます。
const sayHiStranger = () => 'Hi, stranger'
name
上記の例に示すように、匿名関数が変数に割り当てられている場合にのみ、これが推測される
メソッドの匿名関数が
属性を使用できません:const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
name
そしてそれ以上。この推定された.setInterval()
プロパティは、再帰、バインディングイベントなど、関数内から関数を参照できる適切な識別子として使用することはできません。 name
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
匿名関数はプログラムで頻繁に使用するのに適していないと思うので、=>矢印関数形式を使用するのは好きではありません。 - 「あなたはjsを知らない」name
矢印関数の最も重要なことは、これが何を意味するのかを説明するために、次のデモをチェックしてください。(コードペンをここに挿入する必要がありますが、コードペンを直接挿入できないため、ここで省略されています)キーワードをどのように処理するかを覚えておくことです。特に、矢印関数内の
キーワードはリベンドされません。
this
this
では、リスナーが添付されたボタン要素を参照していることがわかります。
Firefox Developer Tools Consoleでは、次のように見えます(ここに画像を挿入する必要がありますが、画像は直接挿入できないため、ここで省略されています)
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
さて、this
ボタンを引用しなくなりました。代わりに、ウィンドウオブジェクトを参照してください:(ここに画像を挿入する必要がありますが、画像は直接挿入できないため、ここで省略されています)
を使用してボタンにクラスを追加する場合、次のようにコードが機能しないことを意味します。
this
const sayHiStranger = function () { return 'Hi, stranger!' }
javaScriptで矢印関数を使用する場合、
キーワードの値は再生されません。親の範囲から継承します(これは語彙スコープと呼ばれます)。この特定のケースでは、問題の矢印関数は、グローバルな範囲にあるメソッドの引数として渡されます。したがって、関数ハンドラーでは、グローバルスコープ、つまりウィンドウオブジェクトにもバインドされています。 this
startBtn.addEventListener()
したがって、プログラムのスタートボタンを参照したい場合は、正しい方法は、矢印関数ではなく通常の関数を使用することです。 this
this
次に注意すべきことは、上記のデモの
の値は何ですか:.setInterval()
それはボタン要素になりますか?全くない。ウィンドウオブジェクトになります! (写真はここに挿入する必要がありますが、写真は直接挿入できないため、ここで省略されています)this
const sayHiStranger = () => 'Hi, stranger'
の引数として渡されるバウンドまたはグローバルな関数にあるため、コンテキストが変更されました。したがって、キーワードの値も変化します。これは、グローバルな範囲に縛られているために変更されます。
この場合、一般的なトリックは、別の変数を含めてキーワードの値を保存して、予想される要素を引き続き参照するようにすることです。
this
.setInterval()
この問題を解決するためにthis
を使用することもできます。
矢印関数を使用して、問題は完全に消えました。矢印関数を使用する場合のthis
の値は次のとおりです。
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
.bind()
今回、コンソールはボタンを記録しました。これが私たちが望んでいたものです。実際、プログラムはボタンのテキストを変更するため、ボタン要素を参照するには
const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
矢印関数this
は独自の
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
矢印関数は、JavaScript関数を書き込むだけの新しい方法ではありません。彼らには独自の制限があります。つまり、場合によっては使用したくない場合があります。前のデモンストレーションのクリックハンドラーは例ですが、これだけではありません。もう少しチェックしましょう。
矢印関数はオブジェクトメソッドとして使用されません。これが例です。
このNetflixSeriesオブジェクトを検討してください。このオブジェクトには、プロパティといくつかの方法があります。 console.log(netflixSeries.getLikes())
は、現在のいいね!console.log(netflixSeries.addLike())
を含むメッセージを1つずつ増やし、コンソールに新しい値と感謝のメッセージを印刷する必要があります。
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
および.getLikes()
は、それぞれオブジェクト.addLike()
とthis.title
のプロパティを参照できません。 this.likes
title
同じ問題は、矢印関数の語彙範囲にあります。 likes
オブジェクトメソッドでは、親の範囲を参照しています。この場合、それは親オブジェクト自体ではなく、ウィンドウオブジェクトです。つまり、NetflixSeriesオブジェクトではありません。
もちろん、解決策は通常の関数を使用することです。
this
注意すべきもう1つのことは、サードパーティライブラリが通常、メソッド呼び出しをバインドして、
const sayHiStranger = function () { return 'Hi, stranger!' }
でバインドハンドラーのDOM要素にアクセスできます。
this
this
const sayHiStranger = () => 'Hi, stranger'
this
フックでは、
const getNetflixSeries = (seriesName, releaseDate) => `The ${seriesName} series was released in ${releaseDate}` // 调用函数 console.log(getNetflixSeries('Bridgerton', '2020') ) // 输出:The Bridgerton series was released in 2020
矢印関数を使用する場合、
は親の範囲を指しますが、const favoriteSeries = seriesName => seriesName === "Bridgerton" ? "Let's watch it" : "Let's go out" // 调用函数 console.log(favoriteSeries("Bridgerton")) // 输出:"Let's watch it"
created
this
矢印関数には引数はありません
不確実な数のパラメーターで関数を作成する必要がある場合があります。たとえば、好みの順にお気に入りのNetflixシリーズをリストする関数を作成するとします。ただし、含めるシリーズの数がわかりません。 JavaScriptはthis
オブジェクトを提供します。これは、呼び出されたときに渡された値を格納するアレイのようなオブジェクト(完全な配列ではありません)です。 message
// 使用括号:正确 const bestNetflixSeries = (seriesName = "Bridgerton") => `${seriesName} is the best` // 输出:"Bridgerton is the best" console.log(bestNetflixSeries()) // 没有括号:错误 const bestNetflixSeries = seriesName = "Bridgerton" => `${seriesName} is the best` // Uncaught SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
// 函数声明 function sayHiStranger() { return 'Hi, stranger!' } // 调用函数 sayHiStranger()
関数を呼び出すと、次のエラーメッセージが表示されます。これは、arguments
オブジェクトが矢印関数で使用できないことを意味します。実際、矢印関数を通常の関数に置き換えると、問題が解決できます。
const sayHiStranger = function () { return 'Hi, stranger!' }
オブジェクトが必要な場合は、矢印関数を使用できません。 arguments
矢印関数を使用して同じ関数をコピーしたい場合はどうなりますか?できることの1つは、ES6(...)の残りのパラメーターを使用することです。機能を書き直す方法は次のとおりです
結論const sayHiStranger = () => 'Hi, stranger'
、this
、.map()
、.sort()
、.forEach()
、.filter()
などの配列メソッドでも適切に機能します。ただし、覚えておいてください。矢印関数は、通常のJavaScript関数を置き換えません。矢印関数が正しいツールである場合にのみ使用することを忘れないでください。 .reduce()
JavaScript Arrow関数についてよく尋ねる質問
矢印関数を定義する方法は?
矢印関数と通常の機能の違いは何ですか?
を持っていません。代わりに、周囲の語彙範囲のthis
値を継承します。
矢印関数はコンストラクターとして使用することはできません。つまり、this
を使用してオブジェクトのインスタンスを作成することはできません。
矢印関数には独自のnew
オブジェクトがありません。代わりに、閉じたスコープarguments
を継承します。
矢印関数はよりシンプルで、シンプルなシングルライン操作により適しています。 arguments
結合の問題を回避するのにも役立ちます。これにより、特定のコーディングパターンが簡素化され、this
、bind
、apply
などの回避策が必要になります。 call
矢印関数は多くのシナリオに役立ちますが、すべての場合には機能しない場合があります。短くて単純な機能に最適です。従来の機能は、独自のthis
コンテキストを必要とする複雑な関数または関数により適している場合があります。
矢印関数はECMAScript 6(ES6)に導入され、最新のブラウザーとnode.jsバージョンでサポートされています。それらは、現代のJavaScript開発で広く使用されています。
矢印関数はコンストラクターとして使用することはできず、独自のオブジェクトを持たず、動的arguments
コンテキストを必要とする方法にはあまり適していません。さらに、それらの簡潔な構文は、複数のステートメントを含む関数に適していない場合があります。 this
がないことを忘れないでください。したがって、動的this
コンテキストを必要とする方法では、予想どおりに機能しない場合があります。 this
矢印関数の単一のパラメーターのブラケットを省略できますか?
以上がJavaScriptの矢印機能:FATおよび簡潔な構文の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。