javascript - Problem mit dem Standardwert eines Funktionsparameters als Funktion in ES6?
阿神
阿神 2017-07-05 11:09:13
0
4
1303

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

阿神
阿神

闭关修行中......

Antworte allen(4)
曾经蜡笔没有小新

一句话:函数的闭包在定义时形成,而非运行时。

给我你的怀抱

把语法糖彻底展开,应该能看清楚点

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

習慣沉默

js是词法作用域,foo值取函数定义时的值而不是执行时的值。

给我你的怀抱

基于回复者的代码:

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();
})();
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage