cari

Rumah  >  Soal Jawab  >  teks badan

Mengapakah menetapkan semula nama fungsi dalam badan fungsi mengubah tingkah lakunya?

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:

  1. mengisytiharkan tatasusunanarr.
  2. Tentukan semula fungsi di dalam fungsi supaya ia kembali arr.
  3. Menggunakan return fun1() untuk mengembalikan hasil fungsi itu sendiri kini telah ditakrifkan semula untuk mengembalikan return fun1()返回函数本身的结果,现在已经重新定义为返回arr,所以这似乎返回arr, jadi ini nampaknya kembali
  4. .

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()似乎返回arrfun1() nampaknya mengembalikan rujukan kepada

, manakala 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粉270891688P粉270891688313 hari yang lalu449

membalas semua(1)saya akan balas

  • P粉037880905

    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() .

    balas
    0
  • Batalbalas