首页 新闻 会员 周边 捐助

关于apply方法的参数问题

0
悬赏园豆:5 [待解决问题]

在一个帖子上看到了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又是为何呢?

一路南风的主页 一路南风 | 初学一级 | 园豆:198
提问于:2020-10-21 20:11
< >
分享
所有回答(2)
2

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 对象上的

by.Genesis | 园豆:2824 (老鸟四级) | 2020-10-22 11:37

我试了一下,func.apply(context, args)改成func()对结果没有影响,所以这里用apply的作用是什么

支持(0) 反对(0) 一路南风 | 园豆:198 (初学一级) | 2020-10-22 11:57

@一路南风: 你给 handle 函数加个形参,handle(a),函数体里打印 a。再看 func.apply(context, args) 和 func(args),应该能看出区别了。

支持(0) 反对(0) zanetti | 园豆:128 (初学一级) | 2020-11-30 01:19
0

arguments是传进去的实参列表,是个类数组,apply就是改变this指向的,和call的区别就是传参列表形式不同,一个是数组一个是直接写

佛系小萌新 | 园豆:210 (菜鸟二级) | 2021-04-02 21:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册