Warum ändert die Neuzuweisung eines Funktionsnamens innerhalb eines Funktionskörpers dessen Verhalten?
P粉270891688
P粉270891688 2024-01-16 22:35:06
0
1
456

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:

  1. deklariert ein Arrayarr.
  2. Definieren Sie die Funktion innerhalb der Funktion neu, sodass sie arr zurückgibt.
  3. Die Verwendung von return fun1() zur Rückgabe des Ergebnisses der Funktion selbst wurde jetzt neu definiert, um return fun1()返回函数本身的结果,现在已经重新定义为返回arr,所以这似乎返回arr zurückzugeben, sodass dies anscheinend
  4. zurückgibt.

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()似乎返回arrfun1() scheint einen Verweis auf

zurückzugeben, während 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()

? 🎜🎜
P粉270891688
P粉270891688

Antworte allen(1)
P粉037880905

当第一次调用时,您的 fun1() 函数重新定义了(相对)全局的 fun1 符号。它将原始函数更改为局部内部函数,该函数关闭了数组。因此,只涉及一个数组,即第一次调用 fun1() 时创建的数组。

另一方面,您的 fun2() 每次调用时都会创建一个全新的数组。

如果您将 fun1() 更改为将内部函数分配给一个局部声明的 fun1 变量,它将与 fun2() 的行为相同。

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage