對this的淺顯的理解

誰調用this就指向誰!當沒有明確調用對象時。this指向window!

先記住一個事,window是對象,是被實例化的對象,實例化過程是在頁面加載的時候由JavaScript引擎完成的;
在JavaScript裏直接使用this,this執行指向window;

函數聲明會在全局作用域構造的時候完成,所以函數聲明是window對象的屬性,所以不管在哪裏聲明函數,聲明函數最終都是屬於window對象,聲明函數裏的this是指向window的;

函數表達式的this也指向window,當他被寫在另一個函數裏面也是這樣;
其實,在JavaScript裏面,任何匿名函數都是屬於window對象,他們也是在全局作用域構造的時候完成定義和賦值,在定義匿名函數的時候它會返回自己的內存地址;

this都是指向實例化對象;
如果要把this從window變成其他對象,那麼就得讓function被實例化--使用new操作符;
使用了new操作符實例化的對象的this指向的是Object實例;
通過字面量方式定義對象的方式是new Object的簡寫,二者是等價的,所以裏面的this也是指向Object實例的;

call和apply將this指針指向方法的第一個參數,如果沒有參數的話,指向window;
bind也可以改變this的指向;
(這三個的區別:apply、call、bind的區別

如果給定義對象裏面傳入了函數
傳入的參數是函數的別名,那麼函數的this就指向window;
傳入的參數是被new過的構造函數,那麼this 就指向實例化的對象本身;
如果想把被傳入的函數對象裏this的指針指向外部字面量定義的對象,那麼就是用apply和call;

總結:在javascript 語言裏沒有通過new(包括對象字面量定義)、call和apply改變函數的this指針,函數的this指針都是指向window的;

例子:
var b = function() {

     console.log(this); 

     return function() {

          console.log(this);
     }
}
var c = b();   // ?window,函數表達式裏的this指向window

c();   // ? window,c現在等於function() { console.log(this); }

var a = {

     fn : c
}

a.fn();   // ? Object,c在一個字面量裏面,字面量創建的對象也相當於new了一次,所以
            //this指向一個實例對象

var e = {

     fn : function() {
          c();
     }
}

e.fn();    // ? window 這是一個匿名函數,this指向window,這裏相當於
             //var e = {

             //      fn : function() {
             //           function() {
             //                console.log(this);
             //           }
             //      }
             //}



eval()--該函數執行時的作用域是當前作用域,等同於在該行將裏面的代碼填進去,所以雖然在指向的時候看起來沒有指定當前對象,但是this不是指向window的;

關於addEventListener()和attachEvent():
在IE中,使用attachEvent進行事件綁定,this指向的是window而不是當前節點;
在其他瀏覽器中,使用adEventListener進行事件綁定,this指向的是當前節點;

這裏有個關於作用域的文章:關於JavaScript的作用域

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章