首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.call应该如何为ES6 Arrow函数工作(根据标准)?

.call应该如何为ES6 Arrow函数工作(根据标准)?
EN

Stack Overflow用户
提问于 2015-08-07 19:54:48
回答 2查看 802关注 0票数 6

我正在为ES6使用交叉编译器(Babel,即将成为ES6),它目前不支持使用=>语法生成的函数的正确的.call行为;当我用.call调用它们时,它们的this值仍然是它们第一次创建时从父作用域继承的值,而不是我向.call传递的第一个参数。

这是他们的故意行为吗,按照ES6标准(这将是非常令人失望的)?或者这仅仅是交叉编译器的一个限制?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-07 20:14:54

规格是这么说的:

ArrowFunction不为参数、超级、此或new.target定义本地绑定。对ArrowFunction中的参数、超级、此或new.target的任何引用都必须解析为在词汇上封闭的环境中的绑定。

也就是说,它被固定在定义它的上下文中。你不能动态地改变它。特别是在Function.prototype.call上,它说:

如果func是箭头函数或绑定函数,那么thisArg将被步骤5中的函数[调用]忽略。

票数 5
EN

Stack Overflow用户

发布于 2016-09-30 16:36:30

如果使用像methodical bellow这样的函数,它将创建一个方法,其中传入this作为回调的第一个参数。这样,您就有了fat箭头语法的所有优点(隐式返回,this不会在后续函数调用中丢失),但仍然能够将其用作方法。当然,还有一个简单的方法语法,它基本上创建了一个传统的es5样式函数(因为它不能用new调用)。

代码语言:javascript
复制
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速记方法代替

代码语言:javascript
复制
const b = {
  add(name,value) {
    this[name] = value
    return this
  }
}
b.add('first',1).add('second',2)
console.log(JSON.stringify(b))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31885626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档