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