javascript之this關鍵字淺析。

來源:互聯網
上載者:User

但凡跟javasript打交道。就萬萬不會不知道this。

初次接觸this,總認為它很強大和神秘。不可預知,似乎有種不為人知的魔力。

因為在接觸到它之前,大部分人認為this是那些oop語言的專利。至少我曾經是這麼認為的。

隨著時間的推移,對javascript的進一步提高。this那神秘的面紗才一步步被揭開。話休繞舌,下面就一起來看看這層神秘的面紗背後的this吧。

首先,我們要知道this是什麼。它的含義。通俗的來說, this首先是一個對象,其次要知道的是this不是由它本身出現在何處來決定的。

而是由調用它的對象來決定的,可以簡單的理解為。是誰調用了this,那麼this便代表誰。比如在全域範圍中調用this。那麼此時的this便代表著全域變數。

例:

console.log(this === window)

 如上文說所的來分析,如是在全域範圍中。this則代表著全域變數。也就是window,那麼事實是不是這樣呢。運行上面的代碼,輸出true。證明this的卻是window.

如果this是在一個對象中出現,那麼正常情況下。this則代表該對象。

例:

var obj = {   fn:function(){      console.log(this === obj);  }}obj.fn();//true

弄明白了這兩點,this的真相似乎已經浮出水面了。下面我們來看一個複雜點的例子。相信有很多人都會犯錯,同時這也是一道經典的面試題。

var length = 20;function fn(){    console.log(this.length);}var o = {length:10,e:function (fn){    fn();   arguments[0]();}}o.e(fn);

相信有不少的同鞋會認為讓面會輸出 20,20; 也有少部分人認為是10,10; 或者20 10,10 20;

但是很遺憾,上面的答案全部錯誤。先不急著公布正確答案,我們來分析一下,看看在運行中this到底代表什麼。

當運行o.e(fn);時,e中的this代表著o。因為是o調用了e。這點相信大家都沒有疑問。

當進入e時。執行fn(); 此時的fn也就是參數傳遞進來的fn,由於函數名只是儲存了一個指向函數的引用。所以此時e內部的fn與外面的fn是一模一樣的。又因為函數內部的this是由函數的調用者決定的。所以此時fn內的this代表了window。這點相信當家也沒有疑問。

當執行arguments[0]()時,由於arguments[0]是函數的第一個參數,等於fn。所以此時的函數也就等於外部的fn,理論上來說this也應該是等於window的。

似乎這麼解釋是合理的。 那麼正確答案就應該是20,20.那麼我又為何說上面的答案中沒有一個是正確的呢。那是因為我們忽略了一點。那就是,arguments。

由於arguments[0]().相當與arguments.0(); 也就是說,正真調用fn的是arguments。所以函數內部的this應該是arguemnts,所以。this.length 等於參數的個數,也就是1.正確答案是20 1.

相信大家都明白了吧,那麼下面我們就來看看是什麼樣的機製造就了this。

首先,當一個函數被運行時。他都會進入一個新的執行環境,就算是同一個函數兩次調用,異或是函數自身遞迴調用,它們所進入的執行環境都是不同的。

當進入這個執行環境的時候,就會建立一個使用中的物件,並且關聯到執行環境中。並且隨之確定函數的範圍鏈,this等。所以this的值與它在那裡出現沒有關聯。反而跟函數的調用者有關。

所以,只要記住。this就是調用函數的那個對象。那麼this就不會在被this相關的問題給難住啦~

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.