Master the JavaScript Interview:

“Master the JavaScript Interview “は、ミッドレベルからシニアレベルのJavaScriptのポジションに応募する際に遭遇する可能性の高い一般的な質問に対する候補者の準備を目的とした記事のシリーズです。

このシリーズを40kドルの質問で始めます。 この質問に間違って答えてしまうと、採用されない可能性が高くなります。 採用されたとしても、ソフトウェア開発者としての経験の長さに関わらず、ジュニア開発者として採用される可能性が高いです。

クロージャが重要なのは、特定の関数のスコープに入るものと入らないものを制御することと、同じスコープ内の兄弟関数間で共有される変数を制御することです。

この質問を逃すと面接で不利になるのは、クロージャがどのように動作するかを誤解していると、JavaScriptに限らず、クロージャに多く依存しているあらゆる言語(Haskell、C#、Pythonなど)において、深い経験がないことを示す明確な赤旗だからです。

クロージャを理解せずに JavaScript をコーディングすることは、文法ルールを理解せずに英語を話そうとするようなものです。

クロージャとは何かを知っているだけでなく、なぜそれが重要なのかを知り、クロージャのいくつかの使用例を簡単に答えられるようにしておく必要があります。

クロージャは、JavaScript でオブジェクト データのプライバシー、イベント ハンドラやコールバック関数、部分的なアプリケーション、currying、その他の関数型プログラミング パターンなどで頻繁に使用されます。

この質問に答えられないと、仕事を失うか、年収が約40万円になってしまうかもしれません。

「クロージャの一般的な用途を2つ挙げることができますか」という素早いフォローアップを用意しておきましょう。”

クロージャとは

クロージャとは、関数を周囲の状態(語彙環境)への参照と一緒に束ねた(囲った)ものです。 言い換えれば、クロージャは、内側の関数から外側の関数のスコープにアクセスすることができます。

クロージャを使うには、他の関数の中に関数を定義し、それを公開します。

クロージャを使用するには、他の関数の中に関数を定義し、それを公開します。

関数を公開するには、その関数を返すか、他の関数に渡します。

内側の関数は、外側の関数が戻った後でも、外側の関数のスコープ内の変数にアクセスできます。 データ プライバシーは、実装ではなくインターフェイスに合わせてプログラムするのに役立つ重要な特性です。

“Program to an interface, not an implementation.”
Design Patterns:

JavaScriptでは、データプライバシーを実現するための主要なメカニズムとしてクロージャが使われています。 データプライバシーのためにクロージャを使用すると、囲まれた変数は、含まれる(外側の)関数内でのみスコープに入ります。 オブジェクトの特権的なメソッドを使わない限り、外部のスコープからデータを取得することはできません。 JavaScriptでは、クロージャースコープ内で定義された公開されたメソッドはすべて特権的なものです。 例えば、

JSBinでこれを使って遊んでみてください。

上の例では、`.get()`メソッドは`getSecret()`のスコープ内で定義されているので、`getSecret()`の変数にアクセスでき、特権的なメソッドとなっています。

データのプライバシーを作り出す方法は、オブジェクトだけではありません。

データのプライバシーを確保する方法はオブジェクトだけではありません。クロージャを使用して、戻り値が内部の状態に影響される可能性のあるステートフルな関数を作成することもできます:

const secret = msg => () => msg;

JSBinで利用できます。 (出力が表示されない場合は、このHTMLをコピーしてHTMLペインに貼り付けてください。)

関数型プログラミングでは、クロージャは部分的なアプリケーション & のキューリングによく使われます。 これにはいくつかの定義が必要です:

適用。

部分適用:関数をその引数に適用して戻り値を生成するプロセス。 ある関数をその引数の一部に適用するプロセスです。 部分的に適用された関数は、後で使用するために返されます。

部分適用では、返された関数内の1つ以上の引数を固定し(関数を部分的に適用し)、返された関数は関数適用を完了するために残りのパラメータを引数として受け取ります。

部分適用では、パラメータを固定するためにクロージャースコープを利用します。 対象となる関数に引数を部分的に適用するジェネリック関数を書くことができます。 次のようなシグネチャーを持つことになります:

partialApply(targetFunction: Function, ...fixedArgs: Any) =>
functionWithFewerParams(...remainingArgs: Any)

上のシグネチャーを読むのに助けが必要な場合は、Rtype:

この関数は、任意の数の引数を取る関数と、その関数に部分的に適用したい引数を取り、残りの引数を取る関数を返します。 例えば、2つの数字を足す関数があったとしましょう。 これを`add10()`と呼びましょう。 add10(5)`の結果は、`15`になるはずです。

const add10 = partialApply(add, 10);
add10(5);

この例では、引数の`10`は、`add10()`のクロージャースコープ内に記憶された固定パラメータになります。

それでは、`partialApply()`の実装例を見てみましょう。

JSBinで利用可能です。 (出力が表示されない場合は、この HTML をコピーして HTML ペインに貼り付けてください。)

見てわかるように、これは単に、`partialApply()` 関数に渡された `fixedArgs` 引数へのアクセスを保持する関数を返します。

まだメンバーでない方は、今すぐサインアップしてください。

Explore the Series

  • クロージャとは何ですか
  • クラス継承とプロトタイピング継承の違いは何ですか
  • 純粋な関数とは何ですか
    • クロージャーとは何ですか
    • とは何ですか
    • とは何ですか
    • とは何ですか
    • とは何ですか
    • とは?
    • 関数合成とは何ですか
    • 関数型プログラミングとは何ですか
    • Promiseとは何ですか
    • ソフトスキル

    Updates:
    2019年7月 – なぜこの質問に間違って答えると、仕事や多額の給料を失う可能性があるのかを説明するために、イントロを明確にしました

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です