標籤:數組 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代碼
- function doSomething(){
- alert(this);
- }
- doSomething();
我是在firefox裡面調試的,所以返回的結果是[Object Window]。
那麼這個 [Object Window], 到底是什麼呢?看看下面的代碼
Js代碼
- function doSomething(){
- alert(this===window);
- }
- doSomething();
看到彈出了true, 也就是說在這種正常情況下,this其實就是window
所以,我們定義了一個全域的變數的時候,可以
var test="Tony";
也可以
window["test"]="Tony";
下面這個例子,進一步說明,正常情況下,函數裡的this就是windowJs代碼
- var test="Tony";
- function doSomething(){
- alert(this.test); //彈出 "Tony";
- alert(window.test); //彈出 "Tony";
- }
- doSomething();
第一次呼應:通過以上幾個例子,我想可以說這幾個例子中得this指的就是他當前函數doSomething()的Window對象。那顧名思義this.test自然就等於window.test了。事實也是如此。
2.我再舉一個閉包的例子,但是在這裡我不會解釋什麼是閉包,只是講this的用法,明天我會學習閉包,今天就先當他是一個未知數,來學習this的一個工具。
看這個例子:
Js代碼
- var name ="The Window"; //建立了一個全域變數name
- var object = { //又建立了一個對象(建立對象的方法有很多種)
- name:"My Object", //建立了一個name屬性(屬性就是引用非函數)
- doSomething:function(){ //建立了一個doSomething方法(方法就是引用了函數)
- return function(){ //這個doSomething方法返回一個匿名函數
- return this.name; //這個匿名函數又返回this.name
- };
- }
- };
- alert(object.doSomething()());
- //由於這個doSomething方法返回的一個函數,所以這樣就可以調用這個函數了
這段代碼的主要解釋我都注在了後面,主要想說的就是:這段代碼返回的結果是"The Window",而不是我所預期的"My Object",前面不是說了嗎? this指的是當前函數的對象, 可是在這裡為什麼就不是呢?其實就是因為閉包的特性,由於這個匿名函數構成了一個閉包,所以他所儲存的就是整個變數對象也就是Window對象。這裡先不說為什麼,明天學閉包的時候我還會用這個例子的,這裡就先接受下來。
那麼如何做才能讓結果返回"My Object"呢?還是那句話this指的是當前函數的對象,那麼問題就簡單了,也就是讓this放在doSomething方法裡,而不是那個匿名函數裡不就可以了嗎?修改代碼如下:
Js代碼
- var name ="The Window";
- var object = {
- name:"My Object",
- doSomething:function(){
- var abc = this ;
- return function(){
- return abc.name;
- };
- }
- };
- alert(object.doSomething()());
第二次呼應:現在再看代碼紅色部分做的修改,this是不是指的是當前doSomething()函數的object對象了?那再輸出結果自然就是"My Object"了。
通過這兩次呼應,是不是感覺已經對this有了一定的瞭解呢,其實this用到的地方還很多,以後還會慢慢講到,比如在jQuery中this依然指的是當前函數的對象。
關於閉包,下次再學,今天看了太多代碼了,腦子有點糊了。https://www.cnblogs.com/yunfeifei/p/4019504.html
call和apply;this;閉包