Während ich JavaScript-Code zurückentwickelte, stieß ich auf diese Funktion:
function fun1() { const arr = ["a", "b", "c", "d", "e"]; fun1 = function () { return arr; }; return fun1(); }
Für mich sieht es überflüssig aus. Der Code scheint zu sein:
arr
. arr
zurückgibt. return fun1()
zur Rückgabe des Ergebnisses der Funktion selbst ist jetzt so umdefiniert, dass sie return fun1()
返回函数本身的结果,现在被重新定义为返回 arr
,所以似乎返回 arr
zurückgibt, sodass es den Anschein hat, als würde sie Also habe ich die Funktion umgeschrieben, um den gesamten überflüssigen Code zu entfernen:
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 Beispiel, das den Unterschied verdeutlicht:
// 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()
的工作方式相同。