在學習javascript的時候,對於call()和apply()的用法老是難以理解,相信不少小夥伴和我又同樣的想法。如今和小夥伴們分享一下。javascript
語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調用一個對象的一個方法,以另外一個對象替換當前對象。java
看完語法和定義仍是難以理解,call函數能夠接受若干個參數,其中第一個參數爲當前操做的對象,後面幾個參數爲調用的方法的參數,這麼說仍是難以理解,直接上代碼:數組
function Teacher(name, age) { //定義一個構造函數Teacher this.name = name; this.age = age; this.intro = function() { alert("My name is " + this.name + "," + "I'm " + this.age) } } function Student(name, age) { //定義一個構造函數Student Teacher.call(this, name, age); //Student調用了Teacher的方法 } var studentA = new Student("Lily", 19); //實例化一個studentA,傳入參數 studentA.intro(); //調用studentA的intro方法 輸出:My name is Lily,I'm 19
上例中,studentA是經過構造函數Student實例化的,本應該繼承Student構造函數的全部可繼承方法,但咱們看到Student函數並無任何方法,可是Student調用了,能夠說是繼承了Teacher的方法,故studentA也就有了intro()方法。其中代碼第十行起到了關鍵做用Teacher.call(this, name, age),此句的做用是令當前對象調用另外一個對象的方法,this關鍵字在這裏指代Student()對象,實例化之後this指代studentA對象,然後面的參數分別爲Teacher傳入的參數。可能上面的例子不是很常見,可是咱們常常見到這樣的代碼:app
var str="你好美女"; Array.prototype.join.call(str,"!"); //你!好!美!女
join方法是數組特有的方法,它是定義在Array()構造函數的原型中的方法,因此咱們實例化的數組就都繼承了這個方法,可是字符串str是沒有join方法,但此處咱們就借用了數組的join方法來處理字符串。在call左邊的表達式爲借用的對象的方法,call()中的第一個參數對象借用call左邊表達式對象的方法(不知道這樣說能不能理解,將就吧)。函數
apply()方法的做用和call方法是同樣的,只是傳入的參數不一樣。學習
語法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另外一個對象替換當前對象。this
apply的第一個參數和call同樣,第二個參數是一個數組對象(類數組也能夠),他再也不是以單個參數列表的形式傳入參數,而是把全部參數都放到一個數組中,一塊兒傳入。這裏就不得不說到arguments對象,它存在於每一個函數中,是函數全部實參組成的一個類數組對象。因此apply的第二個參數傳入arguments對象。看下面示例:prototype
var arr=[2,3,12,5,234,199,21,1000,2432]; var max=Math.max.apply(Math,arr); console.log(max); //2432
數組中沒有求最大值得方法,可是Math對象裏面有max能夠求出最大值,所以咱們使用apply方法讓數組繼承Math的max()方法,從而求出數組中的最大值,一樣上面的方法也能夠用call()方法代替,只不過書寫較爲麻煩,不便於閱讀,代碼爲:code
var max=Math.max.call(Math,2,3,12,5,234,199,21,1000,2432); console.log(max); //2432
關於call和apply最基本的用法就是這些,固然這兩個函數的妙處遠遠不止這些,歡迎大神們補充。對象