簡單理解js的this

  js的this是什麼?關於這個東西,博客園裏面有太多的解釋了,不過,本人看了一下,感受對this解釋的有點複雜了,所以,本人在此給this一個簡單易於理解的定義。函數

  this實際上是js的一個對象,至因而什麼對象呢?很簡單,this這個對象就是:誰調用它它就指向誰。this

  關於這一點,其實,博客園的文章已經說明了不少了,有的文章也說到了點子上,只不過,他們解釋的仍是有點模糊,這裏,我給你們作幾個簡單的對照實驗,根據這幾個對照實驗的結果,你們應該很清楚了。spa

  但願你們根據個人代碼重複實現下面的實驗。code

  首先,咱們來看下面的代碼:對象

//建立一個局部對象a
var a = {
    user:'小東',
    getName:function(){
        return this.user;//返回當前對象的user屬性值
    }
}
//調用a的getName方法
alert(a.getName());

  上面的代碼會輸出什麼呢?沒錯,這裏alert的是····小東····,很簡單,這裏是在a對象的內部調用this嘛,確定是a對象調用this,因此根據···········誰調用this它就指向誰這個定義···········,那麼這裏的this指向的就是a對象。blog

  接下來,咱們再給上面的代碼添加一行:get

//建立一個局部對象a
var a = {
    user:'小東',
    getName:function(){
        return this.user;//返回當前對象的user屬性值
    }
}
//調用a的getName方法
alert(a.getName());
//把局部對象的屬性函數賦值給外面的變量out
var out = a.getName;
//調用out函數
alert(out());

  根據上面的實驗結果,咱們知道直接調用a.getName輸出的是小東,對吧?那麼,咱們把a.getName這個屬性函數賦值給out變量以後,再來調用out會輸出什麼呢?結果是:undefined的。爲何會是undefined的?請思考一會。要是你明白這裏爲何輸出的是undefined的緣由,那麼,我想你對this的理解已經很清楚了。可是,若是,你對本文感興趣,你仍是能夠繼續看下去的。博客

  這裏,我先不解釋爲何在外面引用a對象的getName函數卻得不到a對象裏面的值,咱們轉過彎來說,請看下面的代碼(其實和上面的代碼是差很少的,呵呵):io

//建立一個局部對象a
var a = {
    user:'小東',
    getName:function(){
    return 1;//這裏咱們不返回this,而是返回1
}
}
//調用a的getName方法
alert(a.getName());
//把局部對象的屬性函數賦值給外面的變量out
var out = a.getName;
//調用out函數
alert(out());

  上面的代碼很簡單吧,這裏,咱們不在a對象的getName屬性函數裏面返回a對象的東西,而是返回···1·····,那麼,此刻你再調用out函數,你以爲會輸出什麼呢?沒錯,你獲得的再也不是····undefined····的,而是一個實實在在的數字····1······。這就奇怪了,是吧?當a.getName函數返回的是a對象裏面的user屬性時,咱們用out來引用a.getName函數時,咱們獲得的是undefined的結果,而當a.getName函數返回的是1時,咱們再用out引用a.getName函數卻能夠獲得a.getName裏面的東西?這是怎麼回事呢?function

  緣由很簡單,當咱們調用外面的全局變量out的時候,this它指向的應該out的對象,而不是a對象,而out的對象是誰呢?咱們應該知道,js在全局中聲明的變量的對象是window對象吧。既然調用out時,this指向的是window,那麼函數out=a.getName=function(){return this.user;}裏面的this.user咱們應該寫出window.user對吧?可是,此刻,全局變量中有沒有一個window.user的屬性值呢?沒有吧?既然沒有window.user這個屬性值,那麼咱們alert(window.user)確定是undefined啦。爲了證實這一點,咱們來作下面的實驗:

//建立一個局部對象a
var a = {
    user:'小東',
    getName:function(){
        return this.user;//返回當前對象的user屬性值
    }
}
//調用a的getName方法
alert(a.getName());
//把局部對象的屬性函數賦值給外面的變量out
var out = a.getName;
//咱們增長一個window.user的全局屬性,看看再次調用out函數會輸出什麼
var window.user='window"s username';
//調用out函數
alert(out());

  此刻,當你再執行上面的代碼時,你會發現,out函數輸出的再也不是undefined,而是window's username,這證實了什麼?證實了當out調用this時,this確實指向了window,同時也證實了,this確實是:誰調用它它就指向誰。

  若是你不理解js的全局變量,那麼,咱們能夠把上面的代碼換成下面的代碼再來調用out,你就更加明白了:

//建立一個局部對象a
var a = {
    user:'小東',
    getName:function(){
        return this.user;//返回當前對象的user屬性值
    }
}
//調用a的getName方法
alert(a.getName());
//把局部對象的屬性函數賦值給外面的變量out
var out = a.getName;
//此刻,咱們增長一個user的變量,看看再次調用out函數會輸出什麼
var user='window"s username';
//調用out函數
alert(out());

  這裏,咱們再也不啓用window這個對象,對於外面的屬性和函數,咱們一概都用var 來聲明,既然都用var來聲明,那麼他們應該都指向同一個對象吧?此刻,你再執行上面的代碼,也就是執行out函數,依然能夠alert出window's username。行文到此,this的定義已經再明白不過了,它就是:誰調用它它就指向誰。

  this不難理解,難以理解的是,你要找到那個調用它的········對象·····,只有找到調用this的對象,你才知道this到底指向誰,由於:this的定義就是:誰調用它它就指向誰。

相關文章
相關標籤/搜索