摘要:可能上面的例子不是很常見,但是我們經常見到這樣的代碼你好美女你好美女方法是數組特有的方法,它是定義在構造函數的原型中的方法,所以我們實例化的數組就都繼承了這個方法,但是字符串是沒有方法,但此處我們就借用了數組的方法來處理字符串。
??在學習javascript的時候,對于call()和apply()的用法總是難以理解,相信很多小伙伴和我又一樣的想法。現在和小伙伴們分享一下。
call語法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定義:調用一個對象的一個方法,以另一個對象替換當前對象。
看完語法和定義還是難以理解,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傳入的參數。可能上面的例子不是很常見,但是我們經常見到這樣的代碼:
var str="你好美女"; Array.prototype.join.call(str,"!"); //你!好!美!女
??join方法是數組特有的方法,它是定義在Array()構造函數的原型中的方法,所以我們實例化的數組就都繼承了這個方法,但是字符串str是沒有join方法,但此處我們就借用了數組的join方法來處理字符串。在call左邊的表達式為借用的對象的方法,call()中的第一個參數對象借用call左邊表達式對象的方法(不知道這樣說能不能理解,將就吧)。
applyapply()方法的作用和call方法是一樣的,只是傳入的參數不同。
語法:apply([thisObj[,argArray]])
定義:應用某一對象的一個方法,用另一個對象替換當前對象。
apply的第一個參數和call一樣,第二個參數是一個數組對象(類數組也可以),他不再是以單個參數列表的形式傳入參數,而是把所有參數都放到一個數組中,一起傳入。這里就不得不說到arguments對象,它存在于每個函數中,是函數所有實參組成的一個類數組對象。所以apply的第二個參數傳入arguments對象。看下面示例:
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()方法代替,只不過書寫較為麻煩,不便于閱讀,代碼為:
var max=Math.max.call(Math,2,3,12,5,234,199,21,1000,2432); console.log(max); //2432
關于call和apply最基本的用法就是這些,當然這兩個函數的妙處遠遠不止這些,歡迎大神們補充。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/89302.html
摘要:理解文章中已經比較全面的分析了在中的指向問題,用一句話來總結就是的指向一定是在執行時決定的,指向被調用函數的對象。與和直接執行原函數不同的是,返回的是一個新函數。這個新函數包裹了原函數,并且綁定了的指向為傳入的。 理解 JavaScript this 文章中已經比較全面的分析了 this 在 JavaScript 中的指向問題,用一句話來總結就是:this 的指向一定是在執行時決定的,...
摘要:輸出的作用與和一樣,都是可以改變函數運行時上下文,區別是和在調用函數之后會立即執行,而方法調用并改變函數運行時上下文后,返回一個新的函數,供我們需要時再調用。 前言 js中的call(), apply()和bind()是Function.prototype下的方法,都是用于改變函數運行時上下文,最終的返回值是你調用的方法的返回值,若該方法沒有返回值,則返回undefined。這幾個方法...
摘要:剩下的兩個,我們分別改變了他們的執行環境,分別指向了和,于是結果就是顯示對象各自的值。如果你仍然對和沒有清晰的認識,可以試著這樣理解。 在Javascript中,每個函數都包含兩個非繼承而來的方法,call和apply。這兩個方法的用途都是在特定的作用域中調用函數,實際上等于設置函數體內的this對象的值。摘自《JavaScript高級程序設計》 apply方法接收兩個參數,第一個參數...
摘要:用的比較多的,通過選擇的節點是一種類似的。它不能應用下的等方法。和都是為了改變某個函數運行時的即上下文而存在的,換句話說,就是為了改變函數體內部的指向。這些的話也就能明白它倆的用處以及它們定義。 要明白call以及apply 首先得知道他們的用法如何有什么用 function cat() {} cat.prototype = { foo...
摘要:三個方法的作用,都是改變的指向,只是用法稍微有些區別什么是既不指向函數自身,也不指函數的詞法作用域。它在函數定義的時候是確定不了的在函數被調用時才發生的綁定,也就是說具體指向什么,取決于你是怎么調用的函數。 1.排序法 思路:給數組先排序(由大到小排序),第一項就是最大值 let arr = [1,5,6,7,9,20,40,2,3]; let max1 = arr.sort(func...
閱讀 423·2019-08-29 12:44
閱讀 3001·2019-08-26 17:49
閱讀 2398·2019-08-26 13:40
閱讀 1180·2019-08-26 13:39
閱讀 3656·2019-08-26 11:59
閱讀 1814·2019-08-26 10:59
閱讀 2454·2019-08-23 18:33
閱讀 2687·2019-08-23 18:30