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

Javascript 在ES6中,我可以使用箭头函数作为带参数的.bind(this,…)的缩写吗?,javascript,parameters,ecmascript-6,arrow-functions,Javascript,Parameters,Ecmascript 6,Arrow Functions,虽然我知道arrow函数不打算完全替代它,但我可以使用arrow函数作为此语法的简写: (function(a, b) { ... }).bind(this, obj.a, obj.b) 我知道这是可能的,但我不知道默认值是否可以是变量: (a = obj.a, b = obj.b) => { ... } 我试了一下,NodeJS冲我吼了一声出乎意料的token=,所以我想知道,做这件事的正确方法是什么 这是一个示例用例,我的。。。创造性语法: var obj = {a: 10, b:

虽然我知道arrow函数不打算完全替代它,但我可以使用arrow函数作为此语法的简写:

(function(a, b) { ... }).bind(this, obj.a, obj.b)
我知道这是可能的,但我不知道默认值是否可以是变量:

(a = obj.a, b = obj.b) => { ... }
我试了一下,NodeJS冲我吼了一声出乎意料的token=,所以我想知道,做这件事的正确方法是什么

这是一个示例用例,我的。。。创造性语法:

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));
在ES6中,我可以使用箭头函数作为带参数的.bindthis…的缩写吗

简单的回答是不,不是你想象的那样

我知道可以为arrow函数提供默认值,但我不知道默认值是否可以是变量:

(a = obj.a, b = obj.b) => { ... }
我猜你的意思是给arrow函数的参数默认值。当然,它们可以是变量或任何表达式。但这并不限于箭头函数,任何函数都可以有默认参数值


您将绑定参数与默认参数混为一谈,默认参数会在调用时填充缺少的参数,而绑定参数会提前烧掉它们的值。这就是两个代码片段之间的根本区别。

我基本上试图解决的问题是经典的使用setTimeout调用带有参数的函数的问题,箭头函数除外。但更一般地说,使用任何函数,而不仅仅是setTimeout

有三种几乎相同的方法来解决此问题,最后一种是使用箭头函数:

使用闭包 它可以工作,但我必须明确地将其设置为其他变量,比如self

使用绑定 比第一个好一点,因为我可以在没有任何黑客攻击的情况下使用它,但它会变得相当冗长

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

如何处理结果?a=obj.a,b=obj.b=>{…}表达式创建一个函数。接下来呢?顺便说一句,bind部分应用了一个函数,并且可以重新设置默认参数,因此它们具有不同的语义。完全忽略它是否工作的问题,为什么这是一个好主意?您的代码不能保证obj.a和obj.b在运行arrow函数时不会更改,因此这是一个极其危险的代码构造。在一个很好的提问笔记上,你的标题并没有反映你所问的实际问题,你可能想回顾一下。@zerkms我已经添加了一个用例来解释我为什么要这样做。归根结底,我想少按几个键。这是否是一个好主意也是我感兴趣的事情,但它往往不是应该和不应该的地方。@Mike'Pomax'Kamermans难以置信的危险代码构造,除非它不是。变量就是为了能够改变而发明的。你的代码是正确的ES2015语法。虽然不清楚您为什么不这么做=>this.someFunctionobj.a,obj.b insteadnode目前不支持参数默认值,谢谢。在网上很难找到X不受支持吗?因为您得到的是W、Y和Z都是受支持的。关于ES6语法,我最初未能理解的是,如果我想在另一个函数中引用当前堆栈帧中的参数,则箭头函数会自动执行此操作,而无需传入参数。
functionThatReturnsAPromise()
    .then((function(a, b) { return this.someFunction(a + b); }).bind(this, obj.a, obj.b));
functionThatReturnsAPromise()
    .then(() => this.someFunction(obj.a + obj.b));