轉:js中this、call、apply的用法

(一)關於this
首先關於this我想說一句話,這句話記住了this的用法你也就差很少都能明白了:this指的是當前函數的對象。這句話可能比較繞,我會舉出不少例子和這句話呼應的!(看下文)
1.首先看下面這段代碼, 定義一個函數,彈下this,
數組

Js代碼   收藏代碼
  1. function doSomething(){  
  2.      alert(this);  
  3. }  
  4. doSomething();  

 

我是在firefox裏面調試的,因此返回的結果是[Object Window]。
那麼這個 [Object Window], 究竟是什麼呢?看看下面的代碼
Js代碼   收藏代碼
  1. function doSomething(){  
  2.      alert(this===window);  
  3. }  
  4. doSomething();  
 
看到彈出了true, 也就是說在這種正常狀況下,this其實就是window
因此,咱們定義了一個全局的變量的時候,能夠
var test="Tony";
也能夠
window["test"]="Tony";
下面這個例子,進一步說明,正常狀況下,函數裏的this就是window
Js代碼   收藏代碼
  1. var test="Tony";  
  2. function doSomething(){  
  3.      alert(this.test);     //彈出 "Tony";  
  4.      alert(window.test);   //彈出 "Tony";  
  5. }  
  6. doSomething();  
 

第一次呼應:經過以上幾個例子,我想能夠說這幾個例子中得this指的就是他當前函數doSomething()的Window對象。那顧名思義this.test天然就等於window.test了。事實也是如此。

2.我再舉一個閉包的例子,可是在這裏我不會解釋什麼是閉包,只是講this的用法,明天我會學習閉包,今天就先當他是一個未知數,來學習this的一個工具。
     看這個例子:
     
閉包

Js代碼   收藏代碼
  1. var name ="The Window";                     //建立了一個全局變量name  
  2. var object = {                       //又建立了一個對象(建立對象的方法有不少種)  
  3.       name:"My Object",                //建立了一個name屬性(屬性就是引用非函數)  
  4.       doSomething:function(){          //建立了一個doSomething方法(方法就是引用了函數)  
  5.              return function(){       //這個doSomething方法返回一個匿名函數  
  6.                   return this.name;    //這個匿名函數又返回this.name  
  7.           };  
  8.     }  
  9. };  
  10. alert(object.doSomething()());  
  11.                             //因爲這個doSomething方法返回的一個函數,因此這樣就能夠調用這個函數了  

 
     這段代碼的主要解釋我都注在了後面,主要想說的就是:這段代碼返回的結果是"The Window",而不是我所預期的"My Object",前面不是說了嗎? this指的是當前函數的對象, 但是在這裏爲何就不是呢?其實就是由於閉包的特性,因爲這個匿名函數構成了一個閉包,因此他所保存的就是整個變量對象也就是Window對象。這裏先不說爲何,明天學閉包的時候我還會用這個例子的,這裏就先接受下來。
     那麼如何作才能讓結果返回"My Object"呢?仍是那句話this指的是當前函數的對象,那麼問題就簡單了,也就是讓this放在doSomething方法裏,而不是那個匿名函數裏不就能夠了嗎?修改代碼以下:
    
app

Js代碼   收藏代碼
  1. var name ="The Window";                      
  2. var object = {                        
  3.      name:"My Object",                
  4.      doSomething:function(){  
  5.            var abc = this ;          
  6.            return function(){        
  7.                   return abc.name;     
  8.            };  
  9.       }  
  10. };  
  11. alert(object.doSomething()());  

 
第二次呼應:如今再看代碼紅色部分作的修改,this是否是指的是當前doSomething()函數的object對象了?那再輸出結果天然就是"My Object"了。
      經過這兩次呼應,是否是感受已經對this有了必定的瞭解呢,其實this用到的地方還不少,之後還會慢慢講到,好比在jQuery中this依然指的是當前函數的對象。
(二)關於call
   1.若是咱們調用函數的時候,想讓函數裏的 this 表明別的對象,而不是當前函數的對象。有什麼辦法呢?那就只好使用call和apply了(對於我這種初學者,這兩個東西太噁心了)                  
     一般咱們調用函數,都是直接採用如下形式調用
     [調用] 函數名();  //doSomething();
     其實咱們還能夠採用其它方法, 好比 call 這個單詞,就是調用的意思,咱們這裏要用到它。
仍是以doSomething函數爲例:
     中文:函數名.調用();
     英文:doSomething.call();
     代碼以下:
    
函數

Js代碼   收藏代碼
  1. var test="Tony";  
  2. function doSomething(){  
  3.     alert(this.test);     //彈出 "Tony";  
  4. }  
  5.   
  6. doSomething(); //   [調用]  doSomething();  
  7. doSomething.call(); // 函數.調用()  

 
如今咱們只是作了函數的調用,尚未改變this那麼怎麼改變 this 呢?這個時候call就要發揮威力了。
原本doSomething函數裏的this表示的是 window ,咱們執行下面這句。
     doSomething.call(某個對象);
這個時候doSomething裏的this就變成了"某個對象",看下面的例子:
     
工具

Js代碼   收藏代碼
  1. var test="Tony";  
  2. var myobj={  
  3.     test : "Tom"  
  4. };  
  5. function doSomething(){  
  6.     alert(this.test);     
  7. }  
  8. toolmao.call(); // 彈出 window.test   ,即 "Tony"  
  9. toolmao.call(myobj); // 這個時候,doSomething函數裏的this指向 myobj,  
  10.                           //因此彈出的是 myobj.test 即 "Tom"  

 
     2.那若是裏面有參數呢?看代碼
    學習

Js代碼   收藏代碼
  1. var test="Tony";  
  2. var myobj={  
  3.     test : "Tom"  
  4. };  
  5. function doSomething(name, age){  
  6.     alert(this.test + ":" + name + age);    
  7. }  
  8.   
  9. doSomething("Tony",23);//普通調用 結果Tony:Tony23  
  10. doSomething.call(myobj,"Tony",23);//call調用結果Tom:Tony23  

 
上面代碼,咱們能夠看出,相比普通調用, call 只是多了一個用來指定this的參數,call 幹什麼用的?就是幹這個用的!!如今有體會了吧?
(三)關於apply
都知道call的用法了,apply實際上是一個意思。只不過是調用參數的形式不同罷了。
call是一個一個調用參數,而apply是調用一個數組。仍是用上面相同的例子:
    
this

Js代碼   收藏代碼
  1. var test="Tony";  
  2. var myobj={  
  3.      test : "Tom"  
  4. };  
  5. function doSomething(name, age){  
  6.     alert(this.test + ":" + name + age);    
  7. }  
  8. doSomething("Tony",23);//普通調用 結果Tony:Tony23  
  9. doSomething.call(myobj,"Tony",23);//call調用結果Tom:Tony23  
  10. doSomething.apply(object,["Tony",23]);//apply調用 結果與call相同  

 
上面這寫代碼寫紅色部分就是apply的用法。
spa

相關文章
相關標籤/搜索