Unterschiede im Verhalten intern neu definierter Javascript-Funktionen
P粉805931281
P粉805931281 2024-01-10 18:01:18
0
1
479

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:

  1. Deklarieren Sie ein Array arr.
  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 ist jetzt so umdefiniert, dass sie return fun1() 返回函数本身的结果,现在被重新定义为返回 arr,所以似乎返回 arr zurückgibt, sodass es den Anschein hat, als würde sie
  4. zurückgeben.

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

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

? 🎜🎜
P粉805931281
P粉805931281

Antworte allen(1)
P粉101708623

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

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

如果您更改fun1(),以便将内部函数分配给一个在本地声明fun1变量,它将与fun2()的工作方式相同。

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