为了账号安全,请及时绑定邮箱和手机立即绑定

箭头函数(这是一个参数)如何接受 x 的值作为 1 并返回它?

箭头函数(这是一个参数)如何接受 x 的值作为 1 并返回它?

慕哥9229398 2021-08-26 15:06:38
console.log((function(x, f = () => x) {  var x;  var y = x;  x = 2;  return [x, y, f()];})(1));这是代码片段。这里的输出是 (3) [2, 1, 1] 第三个输出如何是 1 而不是 2?此外,如果我在 Scratch JS 上运行此代码,它会打印 (3) [2, 1, 2]为什么这里的输出不同?我尝试在 IIFE 函数中传递第二个参数,如下所示:console.log((function(x, f = (z) => z) {  var x;  var y = x;  x = 2;  return [x, y, f(z)];})(1, 2));但这会引发错误chrome 控制台中的输出是 (3) [2, 1, 1],而 Scratch JS 中的输出是 (3) [2, 1, 2]
查看完整描述

2 回答

?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

在第一种情况下,() => x返回 1,因为您没有将函数作为第二个参数传递,这意味着箭头函数在您的函数之外实例化并保持其自己的上下文。的x在函数内部被限制在不同的上下文中。

这是带有阴影名称变量、名称相同但嵌套上下文不同的经典问题。

在第二个示例中,您将值2作为参数中的函数传递,这就是它抛出的原因。你不能执行2()


查看完整回答
反对 回复 2021-08-26
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

第三个输出如何是 1 而不是 2?[...] 为什么这里的输出不同?


如果代码按编写的方式运行,则在进入函数之前评估默认参数。所以xinf = () => x指的是函数的第一个参数,而不是var x它内部的定义。由于 1 被传递给 IIFE,所以 1 是使用的值。为什么这里的输出不同?看来scratchJS 正在转换为旧版本的javascript。这会将代码变成这样的:


 console.log(function (x) {

    var f = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {

      return x;

    };

    var x;

    var y = x;

    x = 2;

    return [x, y, f()];

  }(1));

现在默认值由函数体内的代码处理。由于hoisting,var x是在执行时引用的变量return x,而不是参数列表中的 x。到调用 f 时,该局部变量已设置为 2,因此记录了 2。


查看完整回答
反对 回复 2021-08-26
  • 2 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信