検索

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

内部的に再定義された Javascript 関数の動作の違い

JavaScript コードをリバース エンジニアリングしていたときに、次の関数を見つけました:

リーリー

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

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

そこで、すべての冗長コードを削除するために関数を書き直しました。 リーリー

しかし、

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

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

これは、違いを説明するための最小限の再現可能な実行可能な例です:

リーリー

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

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

P粉805931281P粉805931281324日前452

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

  • P粉101708623

    P粉1017086232024-01-11 12:15:16

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

    一方、fun2() は呼び出しごとにまったく新しい配列を作成します。

    内部関数が ローカルで宣言された fun1 変数に割り当てられるように fun1() を変更すると、 と同じになります。 fun2( ) も同様に機能します。

    返事
    0
  • キャンセル返事