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