今天被人問到js中的call,apply的區別和用途,解釋了一番後,想到以前在逼乎上看到一位小夥伴生動形象的解釋javascript
自己不難理解,看下MDN就知道了,可是不經常使用,遇到了,還要腦回路迴轉下。或者時間長了,仍是要肯定下去看下文檔,爲了方便記憶:java
貓吃魚,狗吃肉,奧特曼打小怪獸。數組
有天狗想吃魚了app
貓.吃魚.call(狗,魚)dom
狗就吃到魚了this
貓成精了,想打怪獸spa
奧特曼.打小怪獸.call(貓,小怪獸)prototype
或者 馬雲.賺錢.call(我)code
還有一位楊志大佬解釋的更清楚對象
function cat(){ } cat.prototype={ food:"fish", say: function(){ alert("I love "+this.food); } } var blackCat = new cat; blackCat.say();
可是若是咱們有一個對象 whiteDog = {food:"bone"}, 咱們不想對它從新定義say方法,
那麼咱們能夠經過call或apply用blackCat的say方法:blackCat.say.call(whiteDog);
因此,能夠看出call和apply是爲了動態改變this而出現的,當一個object沒有某個方法,可是其餘的有,咱們能夠藉助call或apply用其它對象的方法來操做。
用的比較多的,經過document.getElementsByTagName選擇的dom 節點是一種相似array的array。
它不能應用Array下的push,pop等方法。咱們能夠經過:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
這樣domNodes就能夠應用Array下的全部方法了。
其餘的就不提了,講多了反而迷惑。call 和apply的用法都是同樣的,知識傳參不一樣,apply是數組,call是參數
就這樣記住了。