javascript - 覆盖 .bind 和 .apply 中的 `this`

标签 javascript

我正在阅读this page只是为了温习 .apply 语法,我意识到我的 JS 知识存在差距:

您可以使用 .bind.apply 更改函数中 this 的值(我假设 .call 遵循与 .apply 相同的规则,所以我不会单独谈论它)。所以我想知道,如果我使用 .bind 然后用 .apply 调用它,哪个会优先?

所以我只是从 w3schools 中引用了示例并对其进行了修改:

var person = {
  fullName: function(city, country) {
    return this.firstName + " " + this.lastName + "," + city + "," + country;
  }
}
var person1 = {
  firstName: "John",
  lastName: "Doe"
}

var person2 = {
  firstName: "Mary",
  lastName: "Anne"
}

fn = person.fullName.bind(person2);

console.log(fn.apply(person1, ["Oslo", "Norway"]));

因此,如果它打印 Mary Anne,则 .bind 给出的 this 值优先于 .apply 给出的值。

确实如此!玛丽·安妮被打印了。所以这让我想知道是否还有其他我不太理解的关于this的规则。例如,调用.bind后可以重新绑定(bind)吗?

最佳答案

.bind 返回一个绑定(bind)函数绑定(bind)函数箭头函数永远不会再次更改其上下文,因此您无法重新.bind它们或.apply另一个上下文。

如果我们假设 .bind 是用 JavaScript 本身编写的,那么情况可能会变得更清楚……那么它会写成:

  function bind(context, ...args) {
    const fn = this;
    return function(...args2) {
      // Note: "this" does not get accessed inside this function, so .bind ing it or .apply ing another context doesnt change anything
      return fn.call(context, ...args, ...args2);
    }
 }

关于javascript - 覆盖 .bind 和 .apply 中的 `this`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56296469/

相关文章:

javascript - 单击按钮后如何在 Stripe 中显示微调器?

javascript - 如何订阅 add-sdk 上的事件监听器?

javascript - 显示时全屏 div 以采用默认窗口滚动条

javascript - 按数字拆分并将该数字保留在结果中

javascript - 使用 v-model 的值作为 if 语句的条件是否正确?

JavaScript:将递归结果添加到数组并返回它

javascript - SlickGrid multiSelect ="false"不禁用键盘多选

javascript - 使用 moment.js 检查当天不会在新的一天更新

javascript - 从 javascript 运行 python

javascript - 如何在 JS 中制作雪花飘落的动画?