一、复杂度
- 这个问题本身并不复杂,通过穷举法很容易就能得到有限的结果
二、影响 this 指向的因素
- this 的指向与函数行为有关,函数行为包括:定义,赋值,调用
三、经验性的概括
- 普通函数的 this 指向,只和调用方式有关
- 箭头函数的 this 指向,只和定义环境有关
四、举例说明
- 改变普通函数的调用者
1 <script> 2 // 定义一个方法 3 const person = { 4 getInfo() { 5 console.log(this); 6 }, 7 }; 8 // 把方法拿出来,定义一个顶级变量 9 const getInfo = person.getInfo; 10 11 person.getInfo(); // 调用者:person,this:person 12 getInfo(); // 调用者:window,this:window 13 </script>
- 改变箭头函数的调用者
1 <script> 2 // 定义一个方法 3 const person = { 4 getInfo: () => { 5 console.log(this); 6 }, 7 }; 8 // 把方法拿出来,定义一个顶级变量 9 const getInfo = person.getInfo; 10 11 person.getInfo(); // 定义环境:顶级作用域,this:window 12 getInfo(); // 定义环境:顶级作用域,this:window 13 </script>
- 改变箭头函数的定义环境
1 <script> 2 // 定义一个方法 3 const person = { 4 getInfo() { 5 return () => console.log("person", this); 6 }, 7 }; 8 // 把方法拿出来,定义一个顶级变量 9 const getInfo = person.getInfo; 10 11 person.getInfo()(); // 定义环境:person.getInfo,this:person 12 getInfo()(); // 定义环境:window.getInfo,this:window 13 </script>
- 复杂情况
1 <script> 2 // 定义一个方法 3 const person = { 4 getInfo() { 5 // 定义环境:window.cat,this:window 6 cat()(); 7 // 定义环境:person.cat,this:person 8 cat.call(person)(); 9 return () => console.log("person", this); 10 }, 11 }; 12 // 把方法拿出来,定义一个顶级变量 13 const getInfo = person.getInfo; 14 15 const cat = function () { 16 return () => console.log("cat", this); 17 }; 18 19 person.getInfo()(); // 定义环境:person.getInfo,this:person 20 getInfo()(); // 定义环境:window.getInfo,this:window 21 </script>
- [call, apply, bind] 不需要讨论,因为它们的原理就是改变调用者,我在这里实现了下
五、结尾
- 可以看到,尽管面试题花里胡哨,但是万变不离其宗
- 当然了,掌握好 this 指向,是为了我们能写出更好用的代码
© 版权声明
文章版权归作者所有,未经允许请勿转载。
版权声明:
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com
1、IT大王遵守相关法律法规,由于本站资源全部来源于网络程序/投稿,故资源量太大无法一一准确核实资源侵权的真实性;
2、出于传递信息之目的,故IT大王可能会误刊发损害或影响您的合法权益,请您积极与我们联系处理(所有内容不代表本站观点与立场);
3、因时间、精力有限,我们无法一一核实每一条消息的真实性,但我们会在发布之前尽最大努力来核实这些信息;
4、无论出于何种目的要求本站删除内容,您均需要提供根据国家版权局发布的示范格式
《要求删除或断开链接侵权网络内容的通知》:https://itdw.cn/ziliao/sfgs.pdf,
国家知识产权局《要求删除或断开链接侵权网络内容的通知》填写说明: http://www.ncac.gov.cn/chinacopyright/contents/12227/342400.shtml
未按照国家知识产权局格式通知一律不予处理;请按照此通知格式填写发至本站的邮箱 wl6@163.com