Maison > Questions et réponses > le corps du texte
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
曾经蜡笔没有小新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.
给我你的怀抱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
?
習慣沉默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.
给我你的怀抱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();
})();