Maison  >  Questions et réponses  >  le corps du texte

javascript - Un problème avec la valeur par défaut du paramètre de fonction étant une fonction dans ES6 ?

J'ai beaucoup de confusion sur la situation où la valeur par défaut d'un paramètre de fonction est une fonction
Par exemple

let foo = 'outer';

function bar(func = x => foo) {
  let foo = 'inner';
  console.log(func()); 
}

bar(); //outer

Selon l'introduction de Ruan Yifeng à es6, je sais que si les paramètres de la fonction sont des valeurs par défaut, il y aura d'abord une portée au niveau du bloc encapsulant les paramètres, et la portée au niveau du bloc disparaîtra une fois l'initialisation terminée

Une fois la valeur par défaut du paramètre définie, le paramètre formera une portée (contexte) distincte lorsque la fonction est déclarée et initialisée. Une fois l'initialisation terminée, cette portée disparaîtra. Ce comportement grammatical n'apparaîtra pas lorsque la valeur par défaut du paramètre n'est pas définie.

Je peux comprendre si la valeur par défaut est une variable normale, mais je ne comprends toujours pas pourquoi la sortie ici est externe au lieu d'intérieur

阿神阿神2684 Il y a quelques jours1290

répondre à tous(4)je répondrai

  • 曾经蜡笔没有小新

    曾经蜡笔没有小新2017-07-05 11:11:13

    Une phrase : la fermeture d'une fonction est formée lorsqu'elle est définie, pas lorsqu'elle est exécutée.

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-07-05 11:11:13

    Développez soigneusement le sucre syntaxique et vous devriez pouvoir le voir plus clairement

    let foo = 'outer';
    
    function fk_compiler() {
      return foo;
    }
    
    function bar(func) {
      if (func === undefined) {
        func = fk_compiler;
      }
      let foo = 'inner';
      console.log(func());
    }
    
    bar();

    Ecoute, fk_compiler里是不是只能返回外部作用域下的foo ?

    répondre
    0
  • 習慣沉默

    習慣沉默2017-07-05 11:11:13

    js est une portée lexicale, et la valeur de foo prend la valeur lorsque la fonction est définie plutôt que lorsqu'elle est exécutée.

    répondre
    0
  • 给我你的怀抱

    给我你的怀抱2017-07-05 11:11:13

    Basé sur le code du répondant :

    let foo = 'outer';
    
    function fk_compiler() {
      return foo;
    }
    
    function bar(func) {
      if (func === undefined) {
        func = fk_compiler;
      }
      let foo = 'inner';
      console.log(func());
    }
    
    bar();

    js adopte une portée lexicale, donc peu importe où la fonction est appelée, ou sous quelque forme que ce soit, sa portée lexicale n'est déterminée que par la position au moment où elle est déclarée.

    fk_compiler被声明的作用域在全局,所以,它会去访问全局作用域中的foo. La réponse sortira.

    Code similaire :

    function foo(){
      console.log(this.a);
    }
    (function init(){
      var a = 'inner';//此处改为 window.a = 'global';再试试
      foo();
    })();

    répondre
    0
  • Annulerrépondre