Ich bin beim Reverse Engineering von JavaScript auf diese Funktion gestoßen:
function fun1() { const arr = ["a", "b", "c", "d", "e"]; fun1 = function () { return arr; }; return fun1(); }
Für mich sieht es überflüssig aus. Dieser Code scheint:
arr
. arr
zurückgibt. return fun1()
zur Rückgabe des Ergebnisses der Funktion selbst wurde jetzt neu definiert, um return fun1()
返回函数本身的结果,现在已经重新定义为返回arr
,所以这似乎返回arr
zurückzugeben, sodass dies anscheinend Also habe ich diese Funktion neu geschrieben und den gesamten überflüssigen Code entfernt:
function fun2() { const arr = ["a", "b", "c", "d", "e"]; return arr; }Allerdings war ich überrascht, dass sich diese beiden Funktionen völlig unterschiedlich verhalten .
fun1()
似乎返回对arr
的引用,而fun2()
似乎返回arr
fun1()
scheint einen Verweis auf
fun2()
eine Kopie von zurückzugeben scheint.
Hier ist ein minimal reproduzierbares lauffähiges Beispiel, um den Unterschied zu veranschaulichen:
// This function is redefined inside itself to return arr function fun1() { const arr = ["a", "b", "c", "d", "e"]; fun1 = function() { return arr; }; return fun1(); } // Why not return arr directly? function fun2() { const arr = ["a", "b", "c", "d", "e"]; return arr; } // But the result is different... let test_fun_1 = fun1(); test_fun_1.pop(); test_fun_1 = fun1(); console.log("Logging test_fun_1"); console.log(test_fun_1); // ["a", "b", "c", "d"] let test_fun_2 = fun2(); test_fun_2.pop(); test_fun_2 = fun2(); console.log("Logging test_fun_2"); console.log(test_fun_2); // ["a", "b", "c", "d", "e"] // What is this magic?Sieht aus, als wäre Magie geschehen...
Was ist der Unterschied zwischen fun1()
和fun2()
当第一次调用时,您的
fun1()
函数重新定义了(相对)全局的fun1
符号。它将原始函数更改为局部内部函数,该函数关闭了数组。因此,只涉及一个数组,即第一次调用fun1()
时创建的数组。另一方面,您的
fun2()
每次调用时都会创建一个全新的数组。如果您将
fun1()
更改为将内部函数分配给一个局部声明的fun1
变量,它将与fun2()
的行为相同。