Heim  >  Fragen und Antworten  >  Hauptteil

Unterschiede im Verhalten intern neu definierter Javascript-Funktionen

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粉805931281P粉805931281283 Tage vor431

Antworte allen(1)Ich werde antworten

  • P粉101708623

    P粉1017086232024-01-11 12:15:16

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

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

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

    Antwort
    0
  • StornierenAntwort