首页 新闻 会员 周边 捐助

js关于更改this指向问题

1
悬赏园豆:5 [已解决问题] 解决于 2020-10-09 17:41

apply和call;拿函数防抖来解释:

       function debounce(func, wait, immediate) {

	    let timer;
	    return function() {
	      let context = this,
	          args = arguments;
	      if (timer) clearTimeout(timer);
	      if (immediate) {
	        let callNow = !timer;
	        timer = setTimeout(() => {
	          timer = null;
	        }, wait);
	        if (callNow) func.apply(context, args);
	      } else {
	        timer  = setTimeout(() => {
	          func.apply
	        }, wait)
	      }
	    }
	}

这里面两个apply到底做了那些事?为什么要这么做?我到现在只觉得是为了传参,哪位大佬能给解个惑?拜谢

js
有点小九九的主页 有点小九九 | 菜鸟二级 | 园豆:201
提问于:2020-10-08 16:55

建议改进一下排版,支持markdown语法

dudu 4年前

@dudu: 我也不知道到底怎么识别的 hh,缩进了一下,这次应该看起来好些了吧

有点小九九 4年前
< >
分享
最佳答案
1
收获园豆:5
WMG-Eight | 小虾三级 |园豆:973 | 2020-10-09 11:52

嗯,我看看

有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-09 14:51

大致了解了,剩下不懂的我慢慢研究研究吧

有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-09 17:40
其他回答(1)
0

根据 func 参数值动态调用对应的 function

dudu | 园豆:30778 (高人七级) | 2020-10-08 17:56

就拿上面的防抖例子里面的apply来说,func.apply(context, args);这一步是做了什么?到最后使用这个函数的时候应该也是字面量赋值,或者直接立即执行此函数,this指向还是指向window的对吧?到最后不管是不是更改了this指向它都会指向window 那是不是可以理解这里的apply就是为了给 debounce 函数参数里面第一个参数传参做的准备?

支持(0) 反对(0) 有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-08 18:01

这里的content这个this指向的应该也是window吧

支持(0) 反对(0) 有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-08 18:03

@有点小九九: 我觉得就是为了传 context 保存的 this

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2020-10-08 18:06

@有点小九九: 推荐园子里的一篇博文 js中Function的apply方法与call方法理解

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2020-10-09 09:59

@dudu: 好的, 我去瞅瞅

支持(0) 反对(0) 有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-09 09:59

@dudu: js,内置函数call和apply能更改this指向这一点懂了,但是牵扯到上面的问题就是它用的时候this指向是不是都是指向了window ?既然都是指向window,那是不是说明func.apply(context,args)是不是为了拿到传入debounce函数的函数传的参数(仅仅是针对上面的代码)?

支持(0) 反对(0) 有点小九九 | 园豆:201 (菜鸟二级) | 2020-10-09 10:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册