【问题标题】:Scope of variables inside inline function default parameter [duplicate]内联函数默认参数内的变量范围
【发布时间】:2018-02-27 22:27:22
【问题描述】:

ES6 引入了default parameters。我试图了解内联函数默认参数如何与此新功能一起使用。具体来说它的范围是如何工作的。

以下面两个函数为例:

function one(x, f = function (){return x})
{
    var x = 5;
    console.log([x,f()]);
}

function two(x, f = function (){return x})
{
    x = 5;
    console.log([x,f()]);
}

one(1);//[5,1]
two(1);//[5,5]

这样说是否正确,在函数一中,f 在参数列表中为x 保留了自己的闭包范围,因此当函数将 x 重新定义为新的 var:var x = 5; 时,引用f有,是不是和函数里面的那个一样?

如果是这样,功能一是否等于以下功能三:

function three(x,f)
{
    var x2 = x;
    f = f !== undefined ? f : () => x2;
    var x = 5;
    console.log([x,f()]); //[5,1]
}

如果有人能指出文档的正确部分,我也尝试找到如何记录这种行为,但没有运气。

【问题讨论】:

标签: javascript ecmascript-6


【解决方案1】:

你是对的。在f 中的两个顶级函数x 指的是参数x

案例 3 有一些注意事项。

在第三个示例中,如果未定义 f 并且您在调用函数时返回 x2,它将等于 x 最初的值。当您执行x = 5; 时,您不会更改x2。这是因为当您分配 x2 = x 时,JavaScript 会生成副本而不是引用。

除非x 参数被传递arrayobject x2 将是一个副本而不是x 的引用。

因此,如果您使用 three(3),那么 x2 将始终为 3,因为您永远不会更改它。

【讨论】:

  • 对,我错过了函数三的 var 语句。使用 var 语句,它们应该是相同的,即使使用对象而不是文字值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2012-10-04
  • 2016-10-26
  • 1970-01-01
  • 2015-08-05
  • 2013-03-12
相关资源
最近更新 更多