javascript之this關鍵字淺析。


但凡跟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相關的問題給難住啦~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM