Heim > Fragen und Antworten > Hauptteil
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
给我你的怀抱2017-07-05 11:11:13
把语法糖彻底展开,应该能看清楚点
let foo = 'outer';
function fk_compiler() {
return foo;
}
function bar(func) {
if (func === undefined) {
func = fk_compiler;
}
let foo = 'inner';
console.log(func());
}
bar();
你看,fk_compiler
里是不是只能返回外部作用域下的foo
?
给我你的怀抱2017-07-05 11:11:13
基于回复者的代码:
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采取的是词法作用域,所以,无论函数在哪里被调用,或者以任何形式被调用,其词法作用域只由其被声明时的位置决定。
fk_compiler
被声明的作用域在全局,所以,它会去访问全局作用域中的foo
。答案也就出来了。
类似代码:
function foo(){
console.log(this.a);
}
(function init(){
var a = 'inner';//此处改为 window.a = 'global';再试试
foo();
})();