【问题标题】:Some problems in function default parameters?函数默认参数的一些问题?
【发布时间】:2017-05-28 06:01:08
【问题描述】:

看到这个

let foo = 'outer';

function bar(func = x => foo) {
  let foo = 'inner';
  console.log(func()); 
}

bar(); //outer

我想知道为什么输出是“外部”而不是“内部”。我知道 JavaScript 有词法范围。这个输出让我觉得函数x => foo是在函数bar之外定义的

【问题讨论】:

  • 你明白没有let foo = 'inner'; 中的let 你会得到你所期望的,对吧?
  • 默认参数值访问函数的作用域没有多大意义,所以它们没有。
  • 默认参数表达式在包含其他参数(和函数本身)的特殊范围内进行评估,因此例如function bar(foo, func = x => foo, otherFunc = bar) 将默认func 用于返回参数foo 的函数, 和 otherFunc 到函数本身,但当然,特殊作用域包含函数内部的变量。
  • let 定义了一个新的局部变量,该变量隐藏/覆盖该名称在更高范围内的任何先前定义。此外,let 直到let 语句所在的代码行才会生效。因此,默认函数参数分配中的foo 引用是外部foo,而不是内部foo,因为它是在为foo 定义新值的let 语句之前定义的。对变量的引用是词法的。默认参数中foo 的词法引用是外部foo。或者换句话说,默认参数无权访问函数的范围。
  • @MaazSyedAdeeb 实际上这是 Babel 中的一个错误,你可以看到这个github.com/babel/babel/issues/4173

标签: javascript web ecmascript-6


【解决方案1】:

我知道 js 有词法作用域,这个输出让我觉得函数 x => foo 是在函数 bar 之外定义的

不完全是。它在中间:在参数声明中,它有自己的范围,可以访问其他参数,但不能访问主体。默认初始化器basically desugars to

let foo = 'outer';
function bar() {
  var func = arguments[0] === undefined ? x => foo : arguments[0];
  {
    let foo = 'inner';
    console.log(func());
  }
}
bar(); // outer

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2017-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2010-10-22
    相关资源
    最近更新 更多