02JavaScript的this理解

1.1關(guān)于this的介紹

在js開發(fā)中this的使用頻率很高,而且面試過程中也會碰到關(guān)于this的相關(guān)題目。因此有必要對this的使用方法進(jìn)行總結(jié)一下。

1.2關(guān)于this的定義

this 為JavaScript的關(guān)鍵字 表示“當(dāng)前” 指的調(diào)用函數(shù)的那個(gè)對象。

1.3關(guān)于this的使用情況

(1) 在jquery里面的使用場景 this表示當(dāng)前節(jié)點(diǎn)對象

<!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>關(guān)鍵字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表示當(dāng)前節(jié)點(diǎn)對象
            });
        });
    </script>
</body>
</html>

(2) 在普通函數(shù)的使用場景一

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

(3) 在普通函數(shù)的使用場景二

    <script type="text/javascript">
       window.onload=function(){
           var x=1;
           function fun(){
               this.x=2;
           }
           console.log(x); //輸出 1 
          //可能想不明白為什么這里還是會輸出1,函數(shù)fun里面對x的值重新定義后,但fun并沒有被調(diào)用,所以這里輸出的結(jié)果仍然為 1 
       }
    </script>

(4) 在普通函數(shù)的使用場景三

    <script type="text/javascript">
       window.onload=function(){
           var x=1;
           function fun(){
              console.log(this);  //這里的this指向window對象
               this.x=2;
           }
           fun();//函數(shù)執(zhí)行 x的值變?yōu)?
           console.log(x); //這里輸出 2 
       }
    </script>

(5) 在普通函數(shù)的使用場景四

       window.onload=function(){
          //沒有被綁定的對象 默認(rèn)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);//對象中引用 指向當(dāng)前綁定的對象
           };
           var obj={};
           obj.name='sonia';
           obj.action=fun;
           obj.action(); // 返回顯示  object對象  {name:"sonia",action:fun} 
       }
    </script>

那么我們把上面的代碼再改一下 又會發(fā)生意外的情況:

    <script type="text/javascript">
       window.onload=function(){
           var fun=function(){
               console.log(this);//當(dāng)前綁定的對象
           };
           var obj={};
           obj.name='sonia';
           o.action=fun;
          fun();// 調(diào)用這個(gè)fun函數(shù)    這時(shí)this就指向了window對象
       }
    </script>

(7) 在構(gòu)造函數(shù)里面的使用

//在構(gòu)造函數(shù)里面的this指向當(dāng)前new的對象實(shí)例
 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已經(jīng)重新賦值
            console.log(fun.name);//abc  就近原則 先從最近的地方尋找值 如果沒有 會繼續(xù)往上查找對應(yīng)的值

(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()里面沒有傳入任何參數(shù) 默認(rèn)就是 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()的情況 此時(shí)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這個(gè)函數(shù)對象

(10) 在事件處理函數(shù)中 this 指向誰的事件作用元素

        var btn=document.getElementsByTagName("button")[0];
        btn.onclick=function(){
            console.log(this);// 輸出的是button標(biāo)簽
        }

那么我們再改一下上面的代碼 如下所示:

         function fun(){
             console.log(this);
         }
        var btn=document.getElementsByTagName("button")[0];
        btn.onclick=function(){
          console.log(this); //這里的this指向事件作用元素
           fun();//直接調(diào)用函數(shù)時(shí) this指向window
        }

1.4關(guān)于this的一道面試題

  var number=1;
            var obj={

                number:2,
                showNumber:function(){

                    this.number=3;
                    (function(){
                        console.log(this.number);
                    })(); //這里是匿名函數(shù)自我調(diào)用 在這里的this指向了 window 
                    console.log(this.number);
                }
            };
            obj.showNumber();
          所以最終輸出的結(jié)果為:  1  3  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容