JavaScript のリバース エンジニアリング中にこの関数を発見しました:
リーリー私にとって、それは冗長に見えます。このコードは次のようになります:
arr
を宣言します。 arr
を返すようにします。 return fun1()
を使用すると、関数自体の結果が返されますが、この関数は arr
を返すように再定義されているため、arr
を返すように見えます。 したがって、この関数を書き直して、冗長なコードをすべて削除しました。 リーリー
しかし、2 つの関数の動作がまったく異なることに驚きました。
fun1() は
arr への参照を返すように見えますが、
fun2() は
arr のコピーを返すように見えます。
リーリー
魔法が起こったようです...
fun1() と
fun2() の違いは何ですか?
最初に呼び出されたとき、
fun1()
関数は (比較的) グローバルな fun1シンボルを
再定義します。元の関数を、配列を閉じるローカル内部関数に変更します。したがって、関与する配列は 1 つだけで、最初にfun1()
が呼び出されたときに作成されます。一方、
fun2()
は呼び出されるたびに新しい配列を作成します。fun1()
を変更して内部関数を ローカルで宣言されたfun1
変数に割り当てると、fun2( )
も同様に動作します。