美文网首页我爱编程程序员
02JavaScript的this理解

02JavaScript的this理解

作者: 个人不完美 | 来源:发表于2018-05-23 15:24 被阅读0次

1.1关于this的介绍

在js开发中this的使用频率很高,而且面试过程中也会碰到关于this的相关题目。因此有必要对this的使用方法进行总结一下。

1.2关于this的定义

this 为JavaScript的关键字 表示“当前” 指的调用函数的那个对象。

1.3关于this的使用情况

(1) 在jquery里面的使用场景 this表示当前节点对象

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>关键字this</title>
</head>
<body>
    <ul>
        <li>a</li>
        <li>b</li>
        <li>c</li>
        <li>d</li>
    </ul>
    <script src="./js/jquery-1.9.1.min.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $("ul li").click(function(){
                $(this).css("color","red");//this表示当前节点对象
            });
        });
    </script>
</body>
</html>

(2) 在普通函数的使用场景一

  <script type="text/javascript">
     window.onload=function(){
         var x=1;
         function fun(){
             this.x;
         }
         console.log(x); // 输出 1  这里的this表示 全局的情况 
     }
  </script>

(3) 在普通函数的使用场景二

    <script type="text/javascript">
       window.onload=function(){
           var x=1;
           function fun(){
               this.x=2;
           }
           console.log(x); //输出 1 
          //可能想不明白为什么这里还是会输出1,函数fun里面对x的值重新定义后,但fun并没有被调用,所以这里输出的结果仍然为 1 
       }
    </script>

(4) 在普通函数的使用场景三

    <script type="text/javascript">
       window.onload=function(){
           var x=1;
           function fun(){
              console.log(this);  //这里的this指向window对象
               this.x=2;
           }
           fun();//函数执行 x的值变为2
           console.log(x); //这里输出 2 
       }
    </script>

(5) 在普通函数的使用场景四

       window.onload=function(){
          //没有被绑定的对象 默认this指向window对象
           var x=1;
           function f1(){
               this.x=2;
           }
           function f2(){
               this.x=3;
           }
           f2();
           f1();
           console.log(x);  // 输出 2 
       }
    </script>

(6) 在对象里面的使用

    <script type="text/javascript">
       window.onload=function(){
           var fun=function(){
               console.log(this);//对象中引用 指向当前绑定的对象
           };
           var obj={};
           obj.name='sonia';
           obj.action=fun;
           obj.action(); // 返回显示  object对象  {name:"sonia",action:fun} 
       }
    </script>

那么我们把上面的代码再改一下 又会发生意外的情况:

    <script type="text/javascript">
       window.onload=function(){
           var fun=function(){
               console.log(this);//当前绑定的对象
           };
           var obj={};
           obj.name='sonia';
           o.action=fun;
          fun();// 调用这个fun函数    这时this就指向了window对象
       }
    </script>

(7) 在构造函数里面的使用

//在构造函数里面的this指向当前new的对象实例
 function Fun(name,age){
                this.name=name;
                this.age=age;
            }
            var fun=new Fun("123",20)
            console.log(fun.name);//123
            // 要注意这种情况
  function Fun(name,age){
                this.name=name;
                this.age=age;
            }
            var fun=new Fun("123",20);
            fun.name='abc'; //这里对name已经重新赋值
            console.log(fun.name);//abc  就近原则 先从最近的地方寻找值 如果没有 会继续往上查找对应的值

(8) 使用apply的情况

var name='123';
            function f(){
                return this.name;
            };
            var o={};
            o.name='sonia';
            o.action=f;
            //o.action();//sonia
            console.log(o.action.apply());  // 这里 输出 123  
            //在apply()里面没有传入任何参数 默认就是 window  ;  但如果apply() 传入了值(对象)
          那么就会找到对象里面的值
           var name='123';
            function f(){
                return this.name;
            };
            var o={};
            o.name='sonia';
            o.action=f;
            console.log(o.action.apply(o));   //输出 sonia 

(9) 使用call()的情况 此时this代表指定的对象

       var obj={name:'sonia'};

        function funOne(){

            console.log(this);
        }

        function funTwo(){

            this.name='123';
        }

        funOne.call(obj); // 输出 {name: "sonia"} 代表obj
        funOne.call(funTwo); //输出funTwo这个函数对象

(10) 在事件处理函数中 this 指向谁的事件作用元素

        var btn=document.getElementsByTagName("button")[0];
        btn.onclick=function(){
            console.log(this);// 输出的是button标签
        }

那么我们再改一下上面的代码 如下所示:

         function fun(){
             console.log(this);
         }
        var btn=document.getElementsByTagName("button")[0];
        btn.onclick=function(){
          console.log(this); //这里的this指向事件作用元素
           fun();//直接调用函数时 this指向window
        }

1.4关于this的一道面试题

  var number=1;
            var obj={

                number:2,
                showNumber:function(){

                    this.number=3;
                    (function(){
                        console.log(this.number);
                    })(); //这里是匿名函数自我调用 在这里的this指向了 window 
                    console.log(this.number);
                }
            };
            obj.showNumber();
          所以最终输出的结果为:  1  3  

相关文章

  • 02JavaScript的this理解

    1.1关于this的介绍 在js开发中this的使用频率很高,而且面试过程中也会碰到关于this的相关题目。因此有...

  • Javascript事件

    2016/05/02Javascript与HTML的交互主要通过事件来实现。 事件流 HTML标签是嵌套的,我们点...

  • 02JavaScript入门-运算符

    1.1 运算符的分类 运算符(operator)也被称为操作符,是用于实现赋值、比较和执行算数运算等功能的符号。J...

  • 理解不曾理解的

    上学时从来没把容貌当成大事儿,只是希望脸上的痘痘能少点,至于什么皮肤白、毛孔粗大、黑眼圈、肤色暗淡、脸型、眉形、眼...

  • 难被理解的理解

    我们都渴望被看见,渴望被理解。这个人性既驱使着我们,也限制着我们。 这是一个强者生存或者说适者生存的社会。这个社会...

  • 对理解的理解

    坚强的人不好做,再大的苦楚也不能说。 儿女情长为何愁,没有事业哪来的人生风流!任凭一路坎坷,也要一路高歌。...

  • 理解!理解!!理解!!!

    1、如何理解MVC设计模式 MVC是一种架构模式,M表示MOdel,V表示视图View,C表示控制器Control...

  • 理解你的理解理顺理解

    理解你的理解理顺你的理解 生活中因为缺乏准确具体到位的沟通和具体的实施方向和可落地的方式,因为信息传达...

  • 理解的与未理解的

    本周继续读的书为《一课经济学》,著者:【美】亨利 黑兹利特 译者:蒲定东 出版:中信出版社 每日5分钟阅读进程已到...

  • 理解的与被理解的

    鲁迅先生在 《而已集·小杂感》写过这样一段话:“楼下一个男人病得要死,那间隔壁的一家唱着留声机,对面是弄孩子。楼上...

网友评论

    本文标题:02JavaScript的this理解

    本文链接:https://www.haomeiwen.com/subject/mosrjftx.html