私は最近になって、Lisp コンテキストにおけるマクロが何であるかを理解し始めました。私の理解では、基本的にコードは 2 つのパスで実行されます。最初のパスでは、インタープリタはマクロの呼び出しを識別し、マクロの呼び出しをその戻り値に置き換えます。次に、コードが通常どおり実行されます。
これは、React のカスタム フックで何が起こるかのように見えます。たとえば、useOnlineStatus
フックがある場合:
これはマクロのようなものです。 useOnlineStatus
フックを次のように使用する場合:
これはマクロの呼び出しに似ています。したがって、次のような場合:
リーリー最初のパスの後、次のように変換されます:
リーリーその後、2 回目のパスでは正常に実行されます。これはカスタム フックで何が起こるかの正確なモデルですか?
目を細めると少し似ていますが、いくつかの点があります:
ブラウザは JavaScript を解析して実行するために複数のパスを実行しますが、フックの呼び出しはこの例ではありません。したがって、コンポーネントの実行には、1 行ずつ実行し、命令が見つかったときに関数にステップインする 1 つのパスだけが必要です。
同じメンタル モデルを すべての 関数呼び出しに適用できます。電話をかけるとき:
これは、Math.max 内のコードを解凍し、それを main 関数に組み込むことと考えることができます。しかし、実際はそうではありません。