关于 js 的 this 指向问题

IT技术2年前 (2022)更新 IT大王
0

一、复杂度

  • 这个问题本身并不复杂,通过穷举法很容易就能得到有限的结果

二、影响 this 指向的因素

  • this 的指向与函数行为有关,函数行为包括:定义,赋值,调用

三、经验性的概括

  1. 普通函数的 this 指向,只和调用方式有关
  2. 箭头函数的 this 指向,只和定义环境有关

四、举例说明

  1. 改变普通函数的调用者
     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>
  2. 改变箭头函数的调用者
     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>
  3. 改变箭头函数的定义环境
     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>
  4. 复杂情况
     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>
  5. [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

相关文章