问题描述
Mozilla Developer Network 声明 call
、bind
和 apply
不应与箭头函数一起使用。有道理,因为它们从定义它们的地方获取父对象的上下文并自行使用。
现在,下面是我在一些视频中看到的“去抖动”的一些代码。在这里使用 apply
是否也有作用?
const getData = () => {
}
const debounce = function(fn,d) {
let timer;
return function() {
let context = this,args = arguments;
clearTimeout(timer);
timer = setTimeout(() => {
fn.apply(context,arguments);
},d);
}
}
编辑:在 debounce 函数中将 getData 更改为 fn。
解决方法
context
参数没有任何作用(因为它设置了 this
,而您不能对箭头函数执行此操作)。
arguments
数组确实得到应用。
如果您专门为箭头函数编写代码,那么惯用的方法是传播参数:
getData(...arguments);
在此特定上下文中,debounce
函数可以处理传递给 fn
的任何类型的函数(并且您应该在超时内使用 fn
而不是 getData
)。
如果您传入一个非箭头函数,则返回的函数将让 this
正常工作。
如果你传入一个箭头函数,那么返回的函数将有 this
不会被改变(但也是正常的!)