我正在为ES6使用交叉编译器(Babel,即将成为ES6),它目前不支持使用=>语法生成的函数的正确的.call行为;当我用.call调用它们时,它们的this值仍然是它们第一次创建时从父作用域继承的值,而不是我向.call传递的第一个参数。
这是他们的故意行为吗,按照ES6标准(这将是非常令人失望的)?或者这仅仅是交叉编译器的一个限制?
发布于 2015-08-07 20:14:54
规格是这么说的:
ArrowFunction不为参数、超级、此或new.target定义本地绑定。对ArrowFunction中的参数、超级、此或new.target的任何引用都必须解析为在词汇上封闭的环境中的绑定。
也就是说,它被固定在定义它的上下文中。你不能动态地改变它。特别是在Function.prototype.call上,它说:
如果func是箭头函数或绑定函数,那么thisArg将被步骤5中的函数[调用]忽略。
发布于 2016-09-30 16:36:30
如果使用像methodical bellow这样的函数,它将创建一个方法,其中传入this作为回调的第一个参数。这样,您就有了fat箭头语法的所有优点(隐式返回,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))
https://stackoverflow.com/questions/31885626
复制相似问题