Rumah > Soal Jawab > teks badan
Saya terjumpa fungsi ini semasa kejuruteraan terbalik beberapa JavaScript:
function fun1() { const arr = ["a", "b", "c", "d", "e"]; fun1 = function () { return arr; }; return fun1(); }
Bagi saya ia kelihatan berlebihan. Kod ini nampaknya:
arr
. arr
. return fun1()
untuk mengembalikan hasil fungsi itu sendiri kini telah ditakrifkan semula untuk mengembalikan return fun1()
返回函数本身的结果,现在已经重新定义为返回arr
,所以这似乎返回arr
, jadi ini nampaknya kembali Jadi saya menulis semula fungsi ini, menghapuskan semua kod berlebihan:
function fun2() { const arr = ["a", "b", "c", "d", "e"]; return arr; }Namun, Saya terkejut apabila mendapati kedua-dua fungsi ini berkelakuan berbeza sama sekali .
fun1()
似乎返回对arr
的引用,而fun2()
似乎返回arr
fun1()
nampaknya mengembalikan rujukan kepada
fun2()
nampaknya mengembalikan salinan .
Berikut ialah contoh minimum yang boleh diulang untuk menggambarkan perbezaannya:
// 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?Nampak macam sihir berlaku...
Apakah perbezaan antara fun1()
和fun2()
P粉0378809052024-01-17 17:06:28
Tatasusunan yang dibuat apabila fun1()
函数重新定义了(相对)全局的 fun1
符号。它将原始函数更改为局部内部函数,该函数关闭了数组。因此,只涉及一个数组,即第一次调用 fun1()
anda mula-mula dipanggil.
Sebaliknya, fun2()
anda akan mencipta tatasusunan serba baharu setiap kali ia dipanggil.
Jika anda menukar fun1()
untuk menetapkan fungsi dalaman kepada pembolehubah diisytiharkan secara tempatan fun1
, ia akan berkelakuan sama seperti fun1()
更改为将内部函数分配给一个局部声明的 fun1
变量,它将与 fun2()
.