问题描述
我正在为ES6使用交叉编译器(Babel,即将成为TypeScript),并且它目前不支持使用=>语法创建的函数的.call行为;
当我打电话给他们与.call ,他们的this值仍然是他们从父作用域继承当我第一次让他们,而不是被我与传递的第一个参数一个.call 。
根据ES6标准,这是否是他们的故意行为(这将非常令人失望)? 还是这只是交叉编译器的限制?
1楼
说明如下:
ArrowFunction没有为参数,super,this或new.target定义本地绑定。 ArrowFunction中对参数,super,this或new.target的任何引用都必须解析为词法包围环境中的绑定。
即,它固定在定义它的上下文中。 您不能动态更改它。 具体在上说:
如果func是箭头函数或绑定函数,则在步骤5中,此[Arg]将被函数[[Call]]忽略。
2楼
如果您使用的功能就像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))