摘要:官方描述方法在指定值和參數(shù)參數(shù)以數(shù)組或類數(shù)組對(duì)象的形式存在的情況下調(diào)用某個(gè)函數(shù)。兩者基本一致,只有一個(gè)區(qū)別,就是方法接受的是若干個(gè)參數(shù)的列表,而方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
Function.prototype.apply() & Function.prototype.call() 官方描述
apply() 方法在指定 this 值和參數(shù)(參數(shù)以數(shù)組或類數(shù)組對(duì)象的形式存在)的情況下調(diào)用某個(gè)函數(shù)。fun.apply(thisArg[, argsArray])
call() 方法在使用一個(gè)指定的this值和若干個(gè)指定的參數(shù)值的前提下調(diào)用某個(gè)函數(shù)或方法。fun.call(thisArg[, arg1[, arg2[, ...]]])
兩者基本一致,只有一個(gè)區(qū)別,就是call()方法接受的是若干個(gè)參數(shù)的列表,而apply()方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
注意點(diǎn)
thisArg: 在 fun 函數(shù)運(yùn)行時(shí)指定的 this 值。需要注意的是,指定的 this 值并不一定是該函數(shù)執(zhí)行時(shí)真正的 this 值,如果這個(gè)函數(shù)處于非嚴(yán)格模式下,則指定為 null 或 undefined 時(shí)會(huì)自動(dòng)指向全局對(duì)象(瀏覽器中就是window對(duì)象,說(shuō)明thisArg可以不傳),同時(shí)值為原始值(數(shù)字,字符串,布爾值)的 this 會(huì)指向該原始值的自動(dòng)包裝對(duì)象(Number,String,Boolean)。
以call為例,apply把后面參數(shù)轉(zhuǎn)化成數(shù)組格式即可
在調(diào)用一個(gè)存在的函數(shù)時(shí),為其指定一個(gè)全新的 this 對(duì)象(原函數(shù)的this對(duì)象此次調(diào)用被覆蓋),并且可以傳遞參數(shù),
function test(a) { console.log(this.one); console.log(a) } test.call({one:1},2) // 1 // 2 //我們?cè)趖est函數(shù)執(zhí)行的時(shí)候綁定一個(gè)對(duì)象 {one:1} 和參數(shù) 2
調(diào)用父構(gòu)造函數(shù),實(shí)現(xiàn)繼承
function a(a) { this.a = a } function b(b) { this.b = b } //想要?jiǎng)?chuàng)建一個(gè)實(shí)例對(duì)象擁有a和b里面的屬性 function c(a,b){ //相當(dāng)于a,b函數(shù)執(zhí)行了一次,所以屬性會(huì)被創(chuàng)建 a.call(this,a) b.call(this,b) } //效果等同于 function c(a,b){ this.a = a; this.b = b } var d = new c(1,2); d會(huì)同時(shí)用于a,b的屬性,這樣在涉及到很多屬性繼承時(shí)候就很方便 //c {a: 1, b: 1}
使用call方法調(diào)用匿名函數(shù),引用官方示例,其實(shí)和1類似
var animals = [ {species: "Lion", name: "King"}, {species: "Whale", name: "Fail"} ]; for (var i = 0; i < animals.length; i++) { (function (i) { this.print = function () { console.log("#" + i + " " + this.species + ": " + this.name); } this.print(); }).call(animals[i], i); } // #0 Lion: King // #1 Whale: Fail知新(for me)
由于call方法需要窮舉所有需要傳遞的參數(shù),所以只能在已知參數(shù)的情況下使用,apply則零活很多,但是接收參數(shù)的情況是一樣的,apply可以將數(shù)組形式默認(rèn)轉(zhuǎn)化成一個(gè)參數(shù)列表 參數(shù)[a,b,c]會(huì)以(a,b,c)的形式接收。
舉例來(lái)說(shuō):
//比較一組數(shù)據(jù)大小 Math.max(9,2,4,6,7) // 9 Math.max([9,2,4,6,7]) // NaN //因?yàn)镸ath.max 方法不能接收一個(gè)數(shù)組 ,所以我們可以進(jìn)行遍歷 var arr = [9,2,4,6,7],arr_len = arr.length,maxNumber = arr[0]; for(var i = 1 ;i< arr_len ;i++){ maxNumber = Math.max(maxNumber,arr[i]) } maxNumber // 9 //這樣能夠達(dá)到效果,但是可以有更方便高效的方法:用apply進(jìn)行改造 Math.max.apply(null,[9,2,4,6,7]) //9 //經(jīng)過(guò)apply轉(zhuǎn)化,Math.max此次執(zhí)行的時(shí)候真正接收的參數(shù)是 (9,2,4,6,7) //所以類似這種本來(lái)需要寫(xiě)成遍歷數(shù)組變量的任務(wù) ,都可以用apply執(zhí)行,Array.prototype.push也是
還有個(gè) bind方法和這兩個(gè)很類似,可以參考另一篇內(nèi)容,詳細(xì)說(shuō)了bind方法
javascript原生一步步實(shí)現(xiàn)bind分析
以上是個(gè)人理解,如果有誤,感謝指導(dǎo)!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/87999.html
摘要:在全局對(duì)象中調(diào)用,自然讀取的是全局對(duì)象的值構(gòu)造器調(diào)用說(shuō)明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對(duì)象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門(mén)花了一天,來(lái)弄懂JavaScript的this,call,apply。中途參考的書(shū)籍也很多,以...
摘要:第二行將函數(shù)的指向一個(gè)字符串第三行將函數(shù)的指向一個(gè)數(shù)字以此類推。再舉一個(gè)例子實(shí)現(xiàn)對(duì)象繼承繼承了的屬性和方法陳安東男姓名年齡性別輸出姓名陳安東年齡性別男這樣用就實(shí)現(xiàn)了繼承用也類似 這里排版不是太好,詳情看我的簡(jiǎn)書(shū) 經(jīng)過(guò)網(wǎng)上的大量搜索,漸漸明白了apply()和call方法的使用,為此寫(xiě)一篇文章記錄一下。 定義 apply()方法: Function.apply(obj,args)obj:...
摘要:本文章記錄本人在學(xué)習(xí)中看書(shū)理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。但是在開(kāi)發(fā)的過(guò)程中,并不是所有的代碼復(fù)用都會(huì)使用到繼承。而且整個(gè)代碼都無(wú)法按照預(yù)期來(lái)運(yùn)行。為了修復(fù)綁定對(duì)象與方法之間的關(guān)系。 本文章記錄本人在學(xué)習(xí) JavaScript 中看書(shū)理解到的一些東西,加深記憶和并且整理記錄下來(lái),方便之后的復(fù)習(xí)。 js 中復(fù)用代碼 說(shuō)道代碼復(fù)用,一般都會(huì)涉及到對(duì)...
摘要:但是在調(diào)用函數(shù)值執(zhí)行之后并沒(méi)有達(dá)到我們想要的效果。解析在這里我們?yōu)槊恳粋€(gè)的事件綁定了一個(gè)匿名函數(shù),這個(gè)匿名函數(shù)就形成了一個(gè)閉包。這樣我們就為每個(gè)的事件的匿名函數(shù),都保存下了自己閉包變量。 博客原址 理解 Javascript中的this 基于不同的調(diào)用方式this的指向也會(huì)有所不同,調(diào)用方式大致有如下幾種: 調(diào)用方式 表達(dá)式 構(gòu)造函數(shù)調(diào)用 new Foo(); 對(duì)象方法...
摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說(shuō)就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫(xiě)在前面: 隔了很長(zhǎng)時(shí)間了,也不知道寫(xiě)點(diǎn)什么。最近一直在研究ES6,一直想寫(xiě)出來(lái)的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
閱讀 2856·2023-04-26 01:02
閱讀 1884·2021-11-17 09:38
閱讀 808·2021-09-22 15:54
閱讀 2913·2021-09-22 15:29
閱讀 905·2021-09-22 10:02
閱讀 3457·2019-08-30 15:54
閱讀 2021·2019-08-30 15:44
閱讀 1607·2019-08-26 13:46