在 ES6 中,我可以使用箭头函数作为带参数的 .bind(this, ...) 的简写吗?

In ES6, can I use Arrow functions as short hand for .bind(this, ...) with arguments?

虽然我知道箭头函数并不能完全替代它,但我可以将箭头函数用作此语法的 shorthand 吗:

(function(a, b) { ... }).bind(this, obj.a, obj.b)

我知道可以give arrow functions default values,但我不知道默认值是否可以是变量:

(a = obj.a, b = obj.b) => { ... }

我试过了,NodeJS 向我咆哮(意想不到的标记 =),所以我想知道,正确的方法是什么?

这是一个示例用例(使用我的 ... "creative" 语法):

var obj = {a: 10, b: 'String'};
functionReturningAPromise()
    .then((a = obj.a, b = obj.b) => this.someFunction(a + b));

对比:

var obj = {a: 10, b: 'String'};
functionReturningAPromise()
    .then((function(a, b) { return this.someFunction(a + b); }).bind(this, obj.a, obj.b));

In ES6, can I use arrow functions as shorthand for .bind(this, …) with arguments?

简短的回答是否定的,不是你想象的那样。

I understand that it is possible to give arrow functions default values, but I don't know if default values can be variables:

我猜你是说 "give arrow function's parameters default values"。当然它们可以是变量或任何表达式。但这不仅限于箭头函数——任何函数都可以有默认参数值。

您混淆了绑定参数(预先将它们的值写入)与默认参数,默认参数在调用时填充缺少的参数。这是你的两个代码片段之间的根本区别。

我主要想解决的问题是经典的 "use setTimeout to call a function with parameters" 问题,箭头函数除外。 (但更一般地说,具有任何函数,而不仅仅是 setTimeout。)

解决这个问题有三种几乎相同的方法(最后一种带有箭头函数):

使用闭包

var self = this;
functionThatReturnsAPromise()
    .then((function() { return self.someFunction(obj.a + obj.b); }));

它有效,但我必须明确地将 this 设置为其他一些变量,例如 self.

使用绑定

functionThatReturnsAPromise()
    .then((function(a, b) { return this.someFunction(a + b); }).bind(this, obj.a, obj.b));

比第一个好一点,因为我可以直接使用 this 而无需任何 hackery,但它有点冗长。

使用 ES6 箭头函数

functionThatReturnsAPromise()
    .then(() => this.someFunction(obj.a + obj.b));

哈!非常简洁。我不再需要指定 this,也不需要传入任何参数,因为箭头函数保留了父闭包堆栈框架。当箭头函数被执行时,它知道 obj.aobj.b 指的是什么。我现在已经使用 ES6 箭头函数语法实现了 bind 功能。