在现代 JavaScript 中是否存在不能在以前使用 "bind" 的地方使用箭头函数的情况?

Are there cases in modern JavaScript where arrow functions cannot be used where "bind" was previously used?

我仍在学习 bind 和箭头函数的来龙去脉。

似乎我们过去使用 bind 的地方现在应该改用箭头函数,尽管我还没有看到它是这样拼写的。

所以我想知道这是不是真的,或者在某些情况下我们仍然应该使用 bind 即使箭头函数可能有效,或者在某些情况下箭头函数不起作用并且 bind 仍然是做你想做的唯一方法。

或者,如果我完全不喜欢,在新的 JS 代码中,我什么时候应该更喜欢箭头函数,什么时候我应该更喜欢 bind?

我看到 bind 方法的一个额外优势,因为它可以部分应用。

function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

// Create a function with a preset leading argument
var leadingThirtysevenList = list.bind(null, 37);

var list2 = leadingThirtysevenList(); 
// [37]

var list3 = leadingThirtysevenList(1, 2, 3);
// [37, 1, 2, 3]

(礼貌 here

我考虑在 shorthand 语法方便且执行上下文不应该是它自己的情况下使用箭头函数。

我看到了 2 个优点:

部分应用:

绑定方法可用于预先设置函数的参数;它有点让你通过在调用之前传递一个参数来创建一个函数的子函数(不是字面上的,在幕后,只有一个函数),这样你预设的这个参数将用于绑定返回的函数的所有调用。 @Charlie_H 已经解释过了,我再举个例子:

function foo(bar, baz) {
return bar + baz;   
}

var sub_foo = foo.bind(Object.create(null), 20);

console.log(sub_foo(60));
console.log(sub_foo(120));

正如你在上面的例子中看到的,bind 方法允许我创建你可以从 foo 调用的子函数,这个函数将始终使用 20 作为第一个参数。

再说一次,不要让我糟糕的措辞误导您,bind 实际上并没有创建新功能!在幕后,将使用原始函数,唯一的事情是 bind 会执行它的一些魔法,以便始终使用您传递给 bind 的参数。我使用 "sub-function" 这个词是因为它使整个事情更容易理解。



能够将目标函数的 this 绑定到您想要的任何对象:

对于粗箭头函数,粗箭头函数的 this 将始终绑定到封闭范围的 this;使用绑定,您可以将目标函数的 this 绑定到您想要的任何对象:

function foo() {
return this.baz;
}

var bar = foo.bind({baz: "Hell yeah!"});

bar(); // "Hell yeah!"


此外,胖箭头函数的 this 绑定不可覆盖,这是一个微妙的细节但仍然有用。


我还想补充一件事,在《你不懂 JS:this 和对象原型》一书中,Kyle Simpson 说你不应该使用粗箭头函数来绕过 this 复杂性,这有点弯曲 JavaScript 的 this 规则,因为它们的用法可以追溯到 var self = this 模式,而该模式的用法源于对 JavaScript 的 this 缺乏理解行为。简短版本:他更喜欢bind。 不过,我没有看到使用粗箭头函数的任何内容,IMO 它们甚至使代码更具可读性,因为只需查看它们,您就可以看到开发人员正在尝试做什么以及他们如何使用它,同时, bind,在查看 bind 的第一个参数之前,您不知道开发人员到底想做什么以及他们为什么这样做。我建议使用粗箭头函数,您希望粗箭头函数的 this 绑定到当前范围的 this,而 bind 当您希望它绑定到其他对象时。


如果您不明白我的部分回答,请问我,我会尽量在评论中详细说明。