由于函数在未作为对象[1]的属性访问时被赋予“全局上下文”,因此以下内容具有相同的特征:
const foo = ({bar}) => {
bar(); // this === window
}
因为它只是语法糖:
const foo = (x) => {
var bar = x.bar;
bar();
}
这对我来说似乎有点反直觉,因为我现在不得不重新绑定或放弃糖。
有没有办法改变这种行为,以便不改变上下文(除了通过.apply / call / bind显式设置它)?是否有任何关于标准的计划/建议?
答案 0 :(得分:2)
嗯,你回答了自己的问题。如果您将Object作为参数,那么作为属性传递的任何函数都将是一个方法,从而失去上下文,无论语法是什么样的。
你可以做的是从参数的方法中调用绑定函数:
const argumentContainingBar = {
bar: () => { originallyBoundFunction() }
}
现在你可以foo(argumentContainingBar)
而不会失去上下文。
答案 1 :(得分:1)
如果您不想使用call
/ apply
,那么您唯一的选择就是不将属性分配给变量。
说真的,不要使用解构方法。它并没有为此做好。
是否有任何关于标准的计划/建议?
有suggestion in the function-bind proposal,但没有进一步追究。