Perbezaan dalam tingkah laku fungsi Javascript yang ditakrifkan semula secara dalaman
P粉805931281
P粉805931281 2024-01-10 18:01:18
0
1
421

Semasa saya melakukan reverse engineering beberapa kod JavaScript, saya terjumpa fungsi ini:

function fun1() {
    const arr = ["a", "b", "c", "d", "e"];
    fun1 = function () {
        return arr;
    };
    return fun1();
}

Bagi saya ia kelihatan berlebihan. Kod itu nampaknya:

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

Jadi saya menulis semula fungsi untuk 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 dihasilkan semula yang berfungsi untuk menggambarkan perbezaan:

// 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粉805931281
P粉805931281

membalas semua(1)
P粉101708623

Tatasusunan yang dibuat apabila fun1()函数重新定义了(相对)全局的fun1符号。它将原始函数更改为局部内部函数,该函数封闭了数组。因此,只涉及一个数组,即第一次调用fun1() anda mula-mula dipanggil.

Anda fun2() sebaliknya mencipta tatasusunan serba baharu pada setiap panggilan.

Jika anda menukar fun1() supaya fungsi dalaman diberikan kepada pembolehubah diisytiharkan secara tempatan fun1, ia akan berfungsi dengan cara yang sama seperti fun1(),以便将内部函数分配给一个在本地声明fun1变量,它将与fun2() sama.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!