在一个帖子上看到了throttle节流函数的时间戳方法,链接如下:
https://www.cnblogs.com/momo798/p/9177767.html#commentform
代码如下:
function throttle(func, delay) {
var prev = Date.now();
return function() {
var context = this;
var args = arguments;
var now = Date.now();
if (now - prev >= delay) {
func.apply(context, args);
prev = Date.now();
}
}
}
function handle() {
console.log(Math.random());
}
window.addEventListener('scroll', throttle(handle, 1000));
有些不解的地方,望各位大佬指点一二
1、这里调用func函数用了apply方法,有什么作用?直接用func(参数)不行吗?
2、这里把this赋值给context,把arguments赋值给args又有什么作用?我测试了一下,this指的是window,arguments指的是什么不清楚,是scroll事件吗?这两个值传进apply又是为何呢?
1、arguments 是函数调用时传入的参数组成的类数组对象
比如 func(1, 2),arguments 就约等于 [1, 2]
直接 func(参数) 的话相当于把这个类数组对象作为一个参数传给 func 了,就变成了 func([1, 2])
很显然 func(1, 2) 和 func([1, 2]) 的语义不一样
所以直接用 func(参数) 不行
搞清楚 apply 方法是什么作用就知道了
2、arguments 见1,arguments 并不是 scroll 事件,arguments 是个类数组,在这里只是包含了 scroll 事件对象而已
this指的是window 是因为你的事件处理程序是注册在 window 对象上的
我试了一下,func.apply(context, args)改成func()对结果没有影响,所以这里用apply的作用是什么
@一路南风: 你给 handle 函数加个形参,handle(a),函数体里打印 a。再看 func.apply(context, args) 和 func(args),应该能看出区别了。
arguments是传进去的实参列表,是个类数组,apply就是改变this指向的,和call的区别就是传参列表形式不同,一个是数组一个是直接写