JavaScript是一種解釋型的腳本編程語(yǔ)言,常用于網(wǎng)頁(yè)開發(fā),動(dòng)態(tài)改變網(wǎng)頁(yè)內(nèi)容、創(chuàng)建動(dòng)態(tài)效果等。其中,apply是JavaScript中的一個(gè)常用方法,它的作用是為了改變函數(shù)的this指向。使用apply方法,可以將一個(gè)對(duì)象作為參數(shù)傳入某個(gè)函數(shù),然后將這個(gè)函數(shù)指向這個(gè)對(duì)象。下面我們來(lái)詳細(xì)講解一下JavaScript中apply的原理。
在JavaScript中,apply是Function的一個(gè)原型方法,使用apply方法時(shí)需要傳入兩個(gè)參數(shù)。第一個(gè)參數(shù)是在函數(shù)執(zhí)行時(shí)作為函數(shù)上下文指向的對(duì)象,即this所引用的對(duì)象。如果這個(gè)參數(shù)是null或undefined,則默認(rèn)為全局對(duì)象,即window(在瀏覽器中)。第二個(gè)參數(shù)是一個(gè)可選的數(shù)組,其中的元素將作為參數(shù)傳遞給函數(shù),如果不需要傳遞參數(shù),則此參數(shù)可以省略。
function add(a, b) { return a + b + this.c; } var o1 = {c: 3}; var o2 = {c: 4}; console.log(add.apply(o1, [1, 2])); // 6 console.log(add.apply(o2, [1, 2])); // 7
如上述代碼,我們定義了一個(gè)加法函數(shù)add,它需要兩個(gè)參數(shù)。接下來(lái),我們分別將兩個(gè)對(duì)象o1和o2作為參數(shù)傳入,然后使用apply方法使add函數(shù)的this指向這些對(duì)象。最終結(jié)果分別為6和7,表示在o1對(duì)象和o2對(duì)象上執(zhí)行add函數(shù)的結(jié)果。
apply方法的原理可以通過JavaScript的Function.prototype.apply方法的定義來(lái)理解。Function.prototype.apply被定義為:
Function.prototype.apply = function (thisArg, argArray) { // ... };
其中,thisArg表示函數(shù)運(yùn)行時(shí)的this值,argArray是由任意數(shù)量的參數(shù)組成的數(shù)組。下面我們將每一行代碼進(jìn)行分析并解釋。
我們可以發(fā)現(xiàn),在Function.prototype.apply的內(nèi)部實(shí)現(xiàn)中,this指向調(diào)用apply方法的函數(shù),即需要函數(shù)指向改變的那個(gè)函數(shù)。因此,我們可以理解apply方法為函數(shù)綁定this。
Function.prototype.apply = function (thisArg, argArray) { if (typeof this !== 'function') { throw new TypeError('Apply must be called on a function'); } if (!Array.isArray(argArray)) { throw new TypeError('Second argument to apply must be an array'); } var fn = '__apply__' + Date.now(); thisArg[fn] = this; var result = thisArg[fn](...argArray); delete thisArg[fn]; return result; };
FXBinance交易方法,讓你享受到超低的手續(xù)費(fèi),讓你交易沒有障礙,賺取豐厚的收益。
在上述代碼中,首先判斷傳入apply方法的第一個(gè)參數(shù)是否是function。如果這個(gè)條件不成立,則拋出一個(gè)類型錯(cuò)誤的異常。接下來(lái),判斷第二個(gè)參數(shù)是否是一個(gè)數(shù)組,如果不是,同樣會(huì)拋出一個(gè)類型錯(cuò)誤的異常。
代碼的下一部分是將調(diào)用apply方法的函數(shù)綁定到傳入的第一個(gè)參數(shù)上。為了實(shí)現(xiàn)方法綁定,我們需要在第一個(gè)參數(shù)上創(chuàng)建一個(gè)可以唯一識(shí)別方法的屬性,方法的值即為將要執(zhí)行的那個(gè)函數(shù)。這里使用了一個(gè)特殊的方法名稱(__apply__),并將它加上Date.now()的值,這樣就可以保證每次方法調(diào)用都是不同的,不會(huì)重復(fù),并且能夠自動(dòng)清空。
綁定函數(shù)到第一個(gè)參數(shù)上之后,就可以直接執(zhí)行這個(gè)函數(shù),并傳入第二個(gè)參數(shù)數(shù)組。最后,執(zhí)行完函數(shù)之后,解除第一個(gè)參數(shù)與綁定的函數(shù)之間的綁定,并返回函數(shù)的執(zhí)行結(jié)果。
總的來(lái)說(shuō),JavaScript中的apply方法是一種非常實(shí)用的方法,它可以改變函數(shù)體中this指向的對(duì)象,并且還能夠傳入函數(shù)的參數(shù)。我們可以通過Function.prototype.apply()方法的實(shí)現(xiàn)原理來(lái)解析這個(gè)方法的底層實(shí)現(xiàn)。通過理解apply的原理和使用方法,我們可以更好地掌握J(rèn)avaScript中的函數(shù)調(diào)用和上下文環(huán)境。希望通過這篇文章能夠?qū)δ兴鶐椭?/p>