関数本体内で関数名を再割り当てすると、その動作が変わるのはなぜですか?
P粉270891688
P粉270891688 2024-01-16 22:35:06
0
1
462

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

リーリー

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

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

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

しかし、

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

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

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

リーリー

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

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

P粉270891688
P粉270891688

全員に返信(1)
P粉037880905

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

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

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

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート