Pourquoi la réaffectation d'un nom de fonction dans le corps d'une fonction modifie-t-elle son comportement ?
P粉270891688
P粉270891688 2024-01-16 22:35:06
0
1
457

Je suis tombé sur cette fonction lors d'une rétro-ingénierie de JavaScript :

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

Pour moi, cela semble redondant. Ce code semble :

  1. déclare un tableauarr.
  2. Redéfinissez la fonction à l'intérieur de la fonction pour qu'elle renvoie arr.
  3. L'utilisation de return fun1() pour renvoyer le résultat de la fonction elle-même a maintenant été redéfinie pour renvoyer return fun1()返回函数本身的结果,现在已经重新定义为返回arr,所以这似乎返回arr, cela semble donc renvoyer
  4. .

J'ai donc réécrit cette fonction, en éliminant tout le code redondant :

function fun2() {
    const arr = ["a", "b", "c", "d", "e"];
    return arr;
}
Cependant, J'ai été surpris de constater que ces deux fonctions se comportent complètement différemment

.

fun1()似乎返回对arr的引用,而fun2()似乎返回arrfun1() semble renvoyer une référence à

, tandis que fun2() semble renvoyer une copie de

.

Voici un exemple minimal reproductible qui illustre la différence :

// 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?

On dirait que la magie s'est produite...

Quelle est la différence entre fun1()fun2()

? 🎜🎜
P粉270891688
P粉270891688

répondre à tous(1)
P粉037880905

Le tableau créé lorsque votre fun1() 函数重新定义了(相对)全局的 fun1 符号。它将原始函数更改为局部内部函数,该函数关闭了数组。因此,只涉及一个数组,即第一次调用 fun1() est appelé pour la première fois.

D'un autre côté, votre fun2() créera un tout nouveau tableau à chaque fois qu'il sera appelé.

Si vous modifiez fun1() pour attribuer la fonction interne à une variable déclarée localement fun1, elle se comportera de la même manière que fun1() 更改为将内部函数分配给一个局部声明的 fun1 变量,它将与 fun2() .

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal