小程序
小游戏
企业微信
微信支付
扫描小程序码分享
希望能从理论方面讲解一下es6和箭头函数的this指向问题,为什么会指向不同?
1 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
首先 success(){} 其实就是 success: function(){} 然后之所以 this 指向会不同是因为 普通函数默认指向 window 对象,而微信小程序将 window 对象屏蔽了, 所以会输出 undefined 而箭头函数 默认指向定义时的 this 对象,所以会指向当前组件
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
首先 success(){} 其实就是 success: function(){} 然后之所以 this 指向会不同是因为 普通函数默认指向 window 对象,而微信小程序将 window 对象屏蔽了, 所以会输出 undefined 而箭头函数 默认指向定义时的 this 对象,所以会指向当前组件
箭头函数指向定义时的对象,其实是箭头函数没有this指向,他会将他被定义时的 this 对象(上下文) 作为自己的 this 指向
在你的代码中 fun2 是在 window 上下文下被定义的,他只是定义在 obj 对象里面,而不是在 obj 上下文中被定义 ,因为执行到 var obj = {...} 这句代码时,同时对象里面的 函数在这个时候也会被定义,但是没有执行,但是 this 现在是指向 window 的,所以在这时定义的箭头函数 距离他最近的一层的 this 对象是 window,这里是重点。
然后乡下执行 obj.fun1();obj.fun2();
而由于 fun1 是普通函数
你调用 obj.fun1(),其实整个调用链 是 window.obj.fun1();
那么最后调用他的对象就是obj (这就是 普通函数指向最后调用它的对象)
而如果你加一句
let fun1Temp = obj.fun1;
fun1Temp();
虽然最终还是执行 fun1 这个函数,但是 this 已经指向 window 了
因为调用链变成了 window.fun1Temp()