Ich bin sehr verwirrt über die Situation, in der der Standardwert eines Funktionsparameters eine Funktion ist
Zum Beispiel
let foo = 'outer';
function bar(func = x => foo) {
let foo = 'inner';
console.log(func());
}
bar(); //outer
Laut Ruan Yifengs Einführung in ES6 weiß ich, dass, wenn die Funktionsparameter Standardwerte sind, es einen Bereich auf Blockebene geben wird, der die Parameter zuerst umschließt, und der Bereich auf Blockebene verschwindet, nachdem die Initialisierung abgeschlossen ist
Sobald der Standardwert des Parameters festgelegt ist, bildet der Parameter einen separaten Bereich (Kontext), wenn die Funktion deklariert und initialisiert wird. Wenn die Initialisierung abgeschlossen ist, verschwindet dieser Bereich. Dieses grammatikalische Verhalten tritt nicht auf, wenn der Parameter-Standardwert nicht festgelegt ist.
Ich kann verstehen, ob der Standardwert eine normale Variable ist, aber ich verstehe immer noch nicht, warum die Ausgabe hier außen statt inner ist
一句话:函数的闭包在定义时形成,而非运行时。
把语法糖彻底展开,应该能看清楚点
你看,
fk_compiler
里是不是只能返回外部作用域下的foo
?js是词法作用域,foo值取函数定义时的值而不是执行时的值。
基于回复者的代码:
fk_compiler
被声明的作用域在全局,所以,它会去访问全局作用域中的foo
。答案也就出来了。类似代码: