【问题标题】:JavaScript - using apply to invoke function, but 'this' is not being set to the object passed as first argumentJavaScript - 使用 apply 来调用函数,但 'this' 未设置为作为第一个参数传递的对象
【发布时间】:2016-11-13 03:45:28
【问题描述】:

我正在尝试使用 apply 方法来调用 objectify 函数,传递一个值数组并使用 obj 作为对象。但是,this 并未设置为对象,而是设置为全局环境 (window)。

这样做的目的是获取一个字符串数组,然后将这些字符串传递给函数objectify。调用该函数时,它会获取数组值,将它们拆分,如果对象没有具有字符串值的属性,则创建该属性。

下面是代码:

let obj = {};
let arr = ["user.name.firstname=John", "user.name.lastname=Smith"];

const objectify = x => {
let cur = this, v;
return x.split('.').forEach(e => /=/g.test(e) ?
(v = e.split('='), cur[v[0]] = v[1]) : cur[e] ?
cur = cur[e] : (cur[e] = {}, cur = cur[e]))};

objectify.apply(obj,arr);

问题是this 设置为Window 而不是对象obj。我应该如何重写这段代码,以便将obj 设置为this 值?

最终结果应该是修改后的obj 对象,所以它变成:

obj = {user: {name: {firstname: 'John', lastname: 'Smith'}}};

【问题讨论】:

  • 多么奇怪的关闭原因 - 使用 => 而不是普通函数几乎不是印刷错误 - 它甚至不是语法“错误”(因为代码是合法的,但不起作用OP 期望的方式)。
  • 这个问题怎么跑题了?使用了适当的标签,SO 上没有重复的问题,没有印刷错误,问题可以重现。此外,它有助于未来的读者,因为大多数在线解释 Function.prototype.apply 的信息通常使用基本示例而不是更复杂的示例。
  • 严格来说这更像是箭头函数行为的问题,而不是Function.prototype.apply本身的行为问题

标签: javascript apply


【解决方案1】:

发生这种情况(不是双关语)是因为objectify 是一个“箭头函数”,它始终使用它从词法范围继承的this,并且将忽略通过.apply.call 传递的任何内容。

如果您将其重写为普通函数,它应该可以按需要工作。

【讨论】:

  • 成功了,但现在我遇到了另一个问题,即只传递第一个数组值,而忽略任何后续值。
  • @DocGunthrop 是的,如果您使用.apply(obj, array),您不会遍历将作为单独参数传递的参数列表。由于您使用的是 ES6,因此您应该在结果数组上使用“传播”... 参数和 .forEach
  • @DocGunthrop 即function objectify(...x)
猜你喜欢
  • 2017-12-20
  • 2012-05-29
  • 2018-02-23
  • 2012-05-30
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-01-22
  • 2020-10-25
相关资源
最近更新 更多