【问题标题】:Destructuring in function parameters函数参数中的解构
【发布时间】:2017-10-10 15:30:48
【问题描述】:

假设我们有这样的功能:

const func = (a, b, {c: {d}}) => {console.dir(c)}

这个函数应该如何调用以及第三个参数的结构是什么? 我尝试了很多变体,但总是报错:Cannot destructure propertydof 'undefined' or 'null'.

谢谢!

【问题讨论】:

  • func("a", "b", { c: { d: "d" } });
  • 请向我们展示您尝试过的变体。
  • 您可能希望将该代码粘贴到转译器中(例如 babeljs.io/repl),以查看 ES5 版本的功能
  • 顺便说一句,你的意思是console.dir(d)?您的代码中没有声明 c 变量。

标签: javascript ecmascript-6 destructuring


【解决方案1】:

const func = (a, b, {c: {d}}) => {console.dir(d)}
func(null, null, {c: {d: document.location}});

此函数必须使用具有键c 的对象调用,该对象具有键d 作为值的对象:

func(a, b, {c: {d: document.location }}) 

console.dir() 接受任何 JS 对象作为参数。

{ c: {d}} 是一种称为对象解构的语法,它在此上下文中的目的是从作为函数参数传递的对象中解包字段。

{d} 是具有键 d 和变量值 d ({d: d}) 的对象的较短语法。

要从键c 下的对象中解压缩变量d,该对象必须初始化该键!但是,当您进一步解构作为参数传递的对象时,您不会将该对象作为范围内的变量。

在您提供的示例中,您将无法访问对象c,因为它已被解构并且只有对象d 可用。要么你的代码有错误,要么你需要像 Anurat Chapanond 发布的那样。

【讨论】:

  • 没错。我刚刚意识到,在我的答案中,console.dir(c) 通过闭包访问变量 c。 DefLee 更有可能打算调用 console.dir(d)。
  • @AnuratChapanond 这个console.log(c) 实际上让我有点困惑。由于某些原因,我认为解构也会将属性“c”作为函数参数(因为它将整个对象作为第三个参数)
  • @AndrzejSmyk 我想赞成您的回答,但由于我的声誉而不能)感谢您的回答。还有一个问题需要澄清:当我们在函数参数声明中指定“{c: {d}}”时,换句话说,我们想要获取属性“d”并将其内容存储到函数变量“d”中?
【解决方案2】:

这是一个例子。

const func = (a, b, {c: {d}}) => {console.dir(c)},
    c = { d: 'hello' }

func(1, 2, { c })

我将 c 定义为具有属性 d 的对象,它是字符串 'hello'。

调用func时,我传递给函数的第三个参数是一个带有属性c的对象。

{ c } 是 { c: c }

的简写

【讨论】:

  • 你的回答也是有效的。但我对从参数而不是从外部范围获取“c”很感兴趣。现在我明白了,不可能像我那样做
  • 我同意。如果将函数参数声明为 func = (a, b, { c }) => {console.dir(c)},也可以从参数中获取 c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 2021-03-10
  • 1970-01-01
  • 2021-06-10
  • 2016-08-23
  • 1970-01-01
相关资源
最近更新 更多