1. 程式人生 > >十分鐘徹底理解javascript 的 this指向,不懂請砸店

十分鐘徹底理解javascript 的 this指向,不懂請砸店

hub 改變 alert blog var rip def 徹底 文章

函數的this指向誰,和函數在哪裏被定義的,函數在哪裏被執行的沒有半毛錢關系,只遵守下面的規律:

在非嚴格模式中:

1、自執行函數裏面,this永遠指向window;

    <script>
        var a = 1;
        var o = {
            a: 2,
            fn: (function(){                                //自執行函數,在定義的時候就已經執行啦
                console.log(‘自執行函數裏面是window‘,this.a);           //自執行函數裏面的this指向的是window
                
return function() { // 但是這裏的this 指向的是誰調用的這個函數 console.log(‘但是還是要具體問題具體分析‘,this.a) } })() } o.fn(); </script>

結果請看

技術分享

2、給元素的某一個行為綁定方法,當行為觸發所調用的函數裏面this指向的該dom 元素;

    <script>
        var
dd = document.getElementById(‘dd‘); function f1 () { console.log(this); } dd.onclick=f1; // 點擊的那個dom對象 </script>

但是我要是稍微改一下:

    <script>
        var dd=document.getElementById(‘dd‘);
        function fn () {
            console.log(this);
        }
        dd.onclick
=function(){ console.log(this); // dom 對象 fn(); // window ,這時候就看該函數是被誰調用的啦 } </script>

3、看看函數執行有咩有 . ,如果有則是前面的那個,如果沒有則是window

4、在構造函數裏面,this 指向的是當前的實例;

<script>

       function fn() {
           console.log(this);
       };
       function ff () {
             this.name="杜俊成";   
             this.say=function(){  
                 console.log(this);    // this指向該構造函數的原型
                 fn()                  // window ,因為fn 函數的直接調用者是window,
             }
       }

       var a = new ff();     
       a.say();
    </script>

5、使用call / apply 改變了this 的指向;(關於call 和 apply 想一勞永逸的搞明白嗎?請看我的一篇文章)

嚴格模式:

1、自執行函數裏面,this永遠指向undefined;

    <script>
        var obj ={
            fn:(function(){
                // this => undefined
                console.log(this)
                return function(){
                    // this=> obk
                    console.log(this);
                }
            })()
        }
        obj.fn; //obj.fn 的方法在聲明的時候就已經被執行了, window
        obj.fn(); //obj.fn的自執行方法返回的方法執行  obj
    </script>

2、看前面有咩有 . ,如果有則是前面的那個,如果沒有則是undefined

總結就是:嚴格模式和非嚴格模式的區別:當調用主體不明時,嚴格模式是undefined,非嚴格模式是window

<script>
    ‘use strict‘;
    function fn(){
        alert(this);
    }
    /*非嚴格模式*/
    fn.call()//this - window;
    fn.call(null)//this - window;
    fn.call(undefined);//this -undefined
    /*嚴格模式下,給call或apply第一個參數傳誰this就是誰,不傳就是undefined*/
    fn.call() //this - undefined;
    fn.call(null) //this -null;
    fn.call(undefined) //this-undefined
</script>

最後打一個小廣告,本人武大大三學生,熱愛前端開發,有半年的項目經驗和實習經驗,給國內外多家公司做過前端的外包工作;

求北京,上海,杭州靠譜公司的實習,求各位前端大佬們帶飛;

github地址:https://github.com/dujuncheng

技術分享

十分鐘徹底理解javascript 的 this指向,不懂請砸店