【问题标题】:Can I conserve the default this by using Function.bind ? If no, why?我可以使用 Function.bind 保存默认值吗?如果不是,为什么?
【发布时间】:2015-03-13 17:33:50
【问题描述】:

假设我有一个函数:

function onSomethingChanged(field, evt) {
    this.validate(field, evt.target.value);
}

我有一个 React 组件:

<input onChanged={this.onSomethingChanged.bind(null, "username")} />
  1. 如果我将 null 作为 thisArg 传递,我的 this 是否会保留?
  2. 如果没有,如果不明确使用this(不写this.onSomethingChanged.bind(this, "username")),我怎么能保存它。
  3. 如果不是(再次),为什么 JavaScript 会阻止呢?有解决办法吗?

谢谢!

【问题讨论】:

  • 添加反应标签可能吗?
  • @torazaburo 完成,谢谢!
  • 如果你的意思是js库React那么它应该被标记为ReactJS,你使用的标记是用于同名的php库。
  • @JamesMontagne 已修复。
  • 为什么#2 是个问题?如果您不使用闭包并希望正确保留上下文,则在 JavaScript 代码中很常见。

标签: javascript function reactjs


【解决方案1】:

不,函数的上下文 (this) 将是 strict mode 中的 nullnon-strict 模式中的全局对象 (window)

如果你不喜欢 bind 的方法,你可以使用 ES6 arrow functions 来处理这个:

<input onChanged={()=>this.onSomethingChanged("username")} />

或者如果你不喜欢括号:

<input onChanged={$=>this.onSomethingChanged("username")} />

其中$ 是事件对象(可以替换为e 或您喜欢的任何其他字符)。

【讨论】:

  • 这可能是个好方法!我喜欢!我会等待其他答案,如果没有,我会接受你的!
【解决方案2】:

没有。这是任何函数的第一个参数。通过传入 null 你说 this 是 null。

改为这样做。

<input onChanged={this.onSomethingChanged.bind(this, "username")} />

【讨论】:

  • 如果我需要为此写很多绑定,是不是没有捷径?
  • 呃,他们是其他方法来做到这一点。一是不要用这个。改为查看闭包。更容易编写/理解 IMO。您对绑定所做的一切就是使用它创建一个咖喱,并将“用户名”作为默认参数,您可以使用闭包来完成此操作。并且避免使用关键字this,也就不需要绑定了。
  • 但是使用闭包(你的意思是在 onChanged 内部?)的问题是它会污染我的渲染方法并使其不可读。否则,如果您想到其他方式,您能否在答案中提供示例?
  • 你只是在每个字段上调用 ​​validate 吗?
  • 不是所有字段,只是其中的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2020-07-17
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多