在 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.a
和 obj.b
指的是什么。我现在已经使用 ES6 箭头函数语法实现了 bind
功能。
虽然我知道箭头函数并不能完全替代它,但我可以将箭头函数用作此语法的 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.a
和 obj.b
指的是什么。我现在已经使用 ES6 箭头函数语法实现了 bind
功能。