ホームページ  >  に質問  >  本文

関数本体内で関数名を再割り当てすると、その動作が変わるのはなぜですか?

JavaScript のリバース エンジニアリング中にこの関数を発見しました:

リーリー

私にとって、それは冗長に見えます。このコードは次のようになります:

  1. 配列 arr を宣言します。
  2. 関数内で関数を再定義して、arr を返すようにします。
  3. return fun1() を使用すると、関数自体の結果が返されますが、この関数は arr を返すように再定義されているため、arr を返すように見えます。

したがって、この関数を書き直して、冗長なコードをすべて削除しました。 リーリー

しかし、

2 つの関数の動作がまったく異なることに驚きました。

fun1()arr への参照を返すように見えますが、fun2()arr のコピーを返すように見えます。

違いを説明するために、最小限の再現可能な実行可能な例を次に示します:

リーリー

魔法が起こったようです...

fun1()fun2() の違いは何ですか?

P粉270891688P粉270891688276日前410

全員に返信(1)返信します

  • P粉037880905

    P粉0378809052024-01-17 17:06:28

    最初に呼び出されたとき、fun1() 関数は (比較的) グローバルな fun1 シンボルを 再定義します。元の関数を、配列を閉じるローカル内部関数に変更します。したがって、関与する配列は 1 つだけで、最初に fun1() が呼び出されたときに作成されます。

    一方、fun2() は呼び出されるたびに新しい配列を作成します。

    fun1() を変更して内部関数を ローカルで宣言された fun1 変数に割り当てると、fun2( ) も同様に動作します。

    返事
    0
  • キャンセル返事