02JavaScript的this理解

1.1關于this的介紹

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

1.2關于this的定義

this 為JavaScript的關鍵字 表示“當前” 指的調用函數(shù)的那個對象。

1.3關于this的使用情況

(1) 在jquery里面的使用場景 this表示當前節(jié)點對象

<!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表示當前節(jié)點對象
            });
        });
    </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并沒有被調用狱杰,所以這里輸出的結果仍然為 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(){
          //沒有被綁定的對象 默認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>

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

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

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

//在構造函數(shù)里面的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已經(jīng)重新賦值
            console.log(fun.name);//abc  就近原則 先從最近的地方尋找值 如果沒有 會繼續(xù)往上查找對應的值

(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ù) 默認就是 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這個函數(shù)對象

(10) 在事件處理函數(shù)中 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();//直接調用函數(shù)時 this指向window
        }

1.4關于this的一道面試題

  var number=1;
            var obj={

                number:2,
                showNumber:function(){

                    this.number=3;
                    (function(){
                        console.log(this.number);
                    })(); //這里是匿名函數(shù)自我調用 在這里的this指向了 window 
                    console.log(this.number);
                }
            };
            obj.showNumber();
          所以最終輸出的結果為:  1  3  
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瘦材,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子仿畸,更是在濱河造成了極大的恐慌食棕,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错沽,死亡現(xiàn)場離奇詭異簿晓,居然都是意外死亡,警方通過查閱死者的電腦和手機千埃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門憔儿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人放可,你說我怎么就攤上這事谒臼〕” “怎么了?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵蜈缤,是天一觀的道長拾氓。 經(jīng)常有香客問我,道長底哥,這世上最難降的妖魔是什么咙鞍? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮趾徽,結果婚禮上续滋,老公的妹妹穿的比我還像新娘。我一直安慰自己附较,他們只是感情好吃粒,可當我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拒课,像睡著了一般徐勃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上早像,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天僻肖,我揣著相機與錄音,去河邊找鬼卢鹦。 笑死臀脏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的冀自。 我是一名探鬼主播揉稚,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼熬粗!你這毒婦竟也來了搀玖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤驻呐,失蹤者是張志新(化名)和其女友劉穎灌诅,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體含末,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡猜拾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了佣盒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挎袜。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出宋雏,到底是詐尸還是另有隱情芜飘,我是刑警寧澤务豺,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布磨总,位于F島的核電站,受9級特大地震影響笼沥,放射性物質發(fā)生泄漏蚪燕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一奔浅、第九天 我趴在偏房一處隱蔽的房頂上張望馆纳。 院中可真熱鬧,春花似錦汹桦、人聲如沸鲁驶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钥弯。三九已至,卻和暖如春督禽,著一層夾襖步出監(jiān)牢的瞬間脆霎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工狈惫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留睛蛛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓胧谈,卻偏偏與公主長得像忆肾,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子菱肖,可洞房花燭夜當晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內容