关于不使用apply调用会报错

关于不使用apply调用会报错

return function(){

timer && clearTimeout(timer);

timer = setTimeout(() => {

func.apply(this);     

}, delay)

};

setTimeout中的函数this指向search-box,为什么直接调用func()会报错

http://img1.sycdn.imooc.com//climg/5d5df5c500014da204180063.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

你好同学,因为直接调用的函数是window调用的,如果在之前的js中,this应该指向window。不过es6中是严格模式,严格模下指向的是undefined。

祝学习愉快,望采纳。

好帮手慕夭夭 2019-08-22 16:19:22

你好同学,this指向函数的调用者,debounce调用后返回的是一个匿名函数:

http://img1.sycdn.imooc.com//climg/5d5e4dc000013ebb05710146.jpg

实际上query后面所接收的函数是如下匿名函数:

http://img1.sycdn.imooc.com//climg/5d5e4c790001534203390171.jpg

就相当于如下这样:

http://img1.sycdn.imooc.com//climg/5d5e4dfd000132b305710177.jpg

即当输入内容,触发监听中的query, 匿名函数里面的this才会指向触发监听函数的mine-search-box-wrapper。

apply的第一个参数是传递this的指向,通过apply,把这个匿名函数所指向的this传递给func函数本身。

http://img1.sycdn.imooc.com//climg/5d5e4ea60001cb5e02350051.jpg

func是debounce的第一个参数,即如下,这样 this.$emit('query', this.query); 中this指向的就是mine-search-box-wrapper,也就能够指向搜索框的自定义事件了哦。

http://img1.sycdn.imooc.com//climg/5d5e4ee90001f1db05360131.jpg

如果不使用apply传递this的话,同学可以输出一下,this就是undefined,那么如上代码也就没有办法执行了。

http://img1.sycdn.imooc.com//climg/5d5e4fd30001868803610115.jpg

http://img1.sycdn.imooc.com//climg/5d5e4ff100016c2205390126.jpg

祝学习愉快,望采纳。


  • 提问者 慕后端6382265 #1
    老师您好,其实我最不明白的是为什么直接调用func()的this会是undefined
    2019-08-22 19:28:22
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师