javascript - Un problème avec la valeur par défaut du paramètre de fonction étant une fonction dans ES6 ?
阿神
阿神 2017-07-05 11:09:13
0
4
1330

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

阿神
阿神

闭关修行中......

répondre à tous(4)
曾经蜡笔没有小新

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

给我你的怀抱

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 ?

習慣沉默

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.

给我你的怀抱

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();
})();
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal