call和apply;this;閉包

來源:互聯網
上載者:User

標籤:數組   tps   接受   方法   綁定   too   word   思想   繼承   

  對於這兩個原生JS的方法,一直有點繞不過來,朦朦朧朧的感覺。現在詳細梳理一下:

  兩者是基於繼承的思想,

obj.call(thisObj, arg1, arg2, ...);obj.apply(thisObj, [arg1, arg2, ...]);

  兩者作用一致,都是把obj(即this)綁定到thisObj,這時候thisObj具備了obj的屬性和方法。或者說thisObj『繼承』了obj的屬性和方法。

  唯一區別是apply接受的是數組參數,call接受的是連續參數。

  當然,也可以把具體的屬性或方法綁定到目標中。如:blackCat.say.call(whiteDog)  原whiteDog並沒有say方法,而blackCat有,所有通過call來將say方法綁定給whiteDog。   看到知乎上有位網友的一個比較好記的方法:  

貓吃魚,狗吃肉,奧特曼打小怪獸。

有天狗想吃魚了

貓.吃魚.call(狗,魚)

狗就吃到魚了

貓成精了,想打怪獸

奧特曼.打小怪獸.call(貓,小怪獸)

就這樣記住了。

 

  關於this,引用一個比較容易理解的例子,https://www.cnblogs.com/zwyyouho-1/p/4974787.html

首先關於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就是windowJs代碼  
  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方法裡,而不是那個匿名函數裡不就可以了嗎?修改代碼如下:
    

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依然指的是當前函數的對象。

 

  關於閉包,下次再學,今天看了太多代碼了,腦子有點糊了。https://www.cnblogs.com/yunfeifei/p/4019504.html

call和apply;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.