当前位置: 代码迷 >> JavaScript >> .call应该如何用于ES6箭头功能(根据标准)?
  详细解决方案

.call应该如何用于ES6箭头功能(根据标准)?

热度:45   发布时间:2023-06-07 16:32:50.0

我正在为ES6使用交叉编译器(Babel,即将成为TypeScript),并且它目前不支持使用=>语法创建的函数的.call行为; 当我打电话给他们与.call ,他们的this值仍然是他们从父作用域继承当我第一次让他们,而不是被我与传递的第一个参数一个.call

根据ES6标准,这是否是他们的故意行为(这将非常令人失望)? 还是这只是交叉编译器的限制?

说明如下:

ArrowFunction没有为参数,super,this或new.target定义本地绑定。 ArrowFunction中对参数,super,this或new.target的任何引用都必须解析为词法包围环境中的绑定。

即,它固定在定义它的上下文中。 您不能动态更改它。 具体在上说:

如果func是箭头函数或绑定函数,则在步骤5中,此[Arg]将被函数[[Call]]忽略。

如果您使用的功能就像methodical娄它会造成一种方法, this是通过为回调的第一个参数。 这样,您就可以使用胖箭头语法的所有优点(隐式返回, this不会在后续函数调用中丢失),但仍然可以将其用作方法。 当然,还有一种简写的方法语法,它基本上创建了传统的es5样式函数(由于不能用new调用而略有不同)。

 const methodical = func => function(...args) { return func(this, ...args) } const add = methodical( (instance, name, value) => (instance[name] = value, instance) ) const a = { add } a.add('first', 1.23).add('second', 2.74) add.call(a,'third', 3.11) console.log(JSON.stringify(a, null, 2)) 

改为使用es2015速记方法

 const b = { add(name,value) { this[name] = value return this } } b.add('first',1).add('second',2) console.log(JSON.stringify(b)) 

  相关解决方案