2020-9-7 前端達(dá)人
目錄
1.3 函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別
1.4 構(gòu)造函數(shù)Function(了解即可,一般不用)
4.1.1 新的函數(shù)調(diào)用方式apply和call方法
定義函數(shù)的方式有三種:
new Function
(一般不用)
函數(shù)表達(dá)式就是將一個(gè)匿名函數(shù)賦值給一個(gè)變量。函數(shù)表達(dá)式必須先聲明,再調(diào)用。
下面是一個(gè)根據(jù)條件定義函數(shù)的例子:
以上代碼執(zhí)行結(jié)果在不同瀏覽器中結(jié)果不一致。我們可以使用函數(shù)表達(dá)式解決上面的問(wèn)題:
函數(shù)聲明如果放在if-else的語(yǔ)句中,在IE8的瀏覽器中會(huì)出現(xiàn)問(wèn)題,所以為了更好的兼容性我們以后最好用函數(shù)表達(dá)式,不用函數(shù)聲明的方式。
在前面的學(xué)習(xí)中我們了解到函數(shù)也是對(duì)象。注意:函數(shù)是對(duì)象,對(duì)象不一定是函數(shù),對(duì)象中有__proto__原型,函數(shù)中有prototype原型,如果一個(gè)東西里面有prototype,又有__proto__,說(shuō)明它是函數(shù),也是對(duì)象。
對(duì)象都是由構(gòu)造函數(shù)創(chuàng)建出來(lái)的,函數(shù)既然是對(duì)象,創(chuàng)建它的構(gòu)造函數(shù)又是什么呢?事實(shí)上所有的函數(shù)實(shí)際上都是由Function構(gòu)造函數(shù)創(chuàng)建出來(lái)的實(shí)例對(duì)象。
所以我們可以使用Function構(gòu)造函數(shù)創(chuàng)建函數(shù)。
語(yǔ)法:new Function(arg1,arg2,arg3..,body);
arg是任意參數(shù),字符串類(lèi)型的。body是函數(shù)體。
this
的指向
函數(shù)的調(diào)用方式?jīng)Q定了 this
指向的不同:
調(diào)用方式 | 非嚴(yán)格模式 | 備注 |
---|---|---|
普通函數(shù)調(diào)用 | window | 嚴(yán)格模式下是 undefined |
構(gòu)造函數(shù)調(diào)用 | 實(shí)例對(duì)象 | 原型方法中 this 也是實(shí)例對(duì)象 |
對(duì)象方法調(diào)用 | 該方法所屬對(duì)象 | 緊挨著的對(duì)象 |
事件綁定方法 | 綁定事件對(duì)象 | |
定時(shí)器函數(shù) | window |
了解了函數(shù) this 的指向之后,我們知道在一些情況下我們?yōu)榱耸褂媚撤N特定環(huán)境的 this 引用,需要采用一些特殊手段來(lái)處理,例如我們經(jīng)常在定時(shí)器外部備份 this 引用,然后在定時(shí)器函數(shù)內(nèi)部使用外部 this 的引用。
然而實(shí)際上 JavaScript 內(nèi)部已經(jīng)專門(mén)為我們提供了一些函數(shù)方法,用來(lái)幫我們更優(yōu)雅的處理函數(shù)內(nèi)部 this 指向問(wèn)題。這就是接下來(lái)我們要學(xué)習(xí)的 call、apply、bind 三個(gè)函數(shù)方法。call()、apply()、bind()這三個(gè)方法都是是用來(lái)改變this的指向的。
call()
方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this
值和分別地提供的參數(shù)(參數(shù)的列表)。
apply()
方法調(diào)用一個(gè)函數(shù), 其具有一個(gè)指定的 this
值,以及作為一個(gè)數(shù)組(或類(lèi)似數(shù)組的對(duì)象)提供的參數(shù)。
注意:call()
和 apply()
方法類(lèi)似,只有一個(gè)區(qū)別,就是 call()
方法接受的是若干個(gè)參數(shù)的列表,而 apply()
方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
call語(yǔ)法:
fun.call(thisArg[, arg1[, arg2[, ...]]])
call參數(shù):
thisArg
arg1, arg2, ...
apply語(yǔ)法:
fun.apply(thisArg, [argsArray])
apply參數(shù):
thisArg
argsArray
apply()
與 call()
相似,不同之處在于提供參數(shù)的方式。
apply()
使用參數(shù)數(shù)組而不是一組參數(shù)列表。例如:
fun.apply(this, ['eat', 'bananas'])
apply和call都可以改變this的指向。調(diào)用函數(shù)的時(shí)候,改變this的指向:
調(diào)用方法的時(shí)候,改變this的指向:
總結(jié)
apply的使用語(yǔ)法:
1 函數(shù)名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]);
2 方法名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]);
call的使用語(yǔ)法
1 函數(shù)名字.call(對(duì)象,參數(shù)1,參數(shù)2,...);
2 方法名字.call(對(duì)象,參數(shù)1,參數(shù)2,...);
它們的作用都是改變this的指向,不同的地方是參數(shù)傳遞的方式不一樣。
如果想使用別的對(duì)象的方法,并且希望這個(gè)方法是當(dāng)前對(duì)象的,就可以使用apply或者是call方法改變this的指向。
bind() 函數(shù)會(huì)創(chuàng)建一個(gè)新函數(shù)(稱為綁定函數(shù)),新函數(shù)與被調(diào)函數(shù)(綁定函數(shù)的目標(biāo)函數(shù))具有相同的函數(shù)體(在 ECMAScript 5 規(guī)范中內(nèi)置的call屬性)。當(dāng)目標(biāo)函數(shù)被調(diào)用時(shí) this 值綁定到 bind() 的第一個(gè)參數(shù),該參數(shù)不能被重寫(xiě)。綁定函數(shù)被調(diào)用時(shí),bind() 也可以接受預(yù)設(shè)的參數(shù)提供給原函數(shù)。一個(gè)綁定函數(shù)也能使用new操作符創(chuàng)建對(duì)象:這種行為就像把原函數(shù)當(dāng)成構(gòu)造器。提供的 this 值被忽略,同時(shí)調(diào)用時(shí)的參數(shù)被提供給模擬函數(shù)。
bind方法是復(fù)制的意思,本質(zhì)是復(fù)制一個(gè)新函數(shù),參數(shù)可以在復(fù)制的時(shí)候傳進(jìn)去,也可以在復(fù)制之后調(diào)用的時(shí)候傳入進(jìn)去。apply和call是調(diào)用的時(shí)候改變this指向,bind方法,是復(fù)制一份的時(shí)候,改變了this的指向。
語(yǔ)法:
fun.bind(thisArg[, arg1[, arg2[, ...]]])
參數(shù):
thisArg
arg1, arg2, ...
返回值:
返回由指定的this值和初始化參數(shù)改造的原函數(shù)的拷貝。
示例1:
示例2:
call 和 apply 特性一樣
this
的指向
null
或者 undefined
則內(nèi)部 this 指向 window
bind
函數(shù)可以作為參數(shù),也可以作為返回值。
函數(shù)是可以作為參數(shù)使用,函數(shù)作為參數(shù)的時(shí)候,如果是命名函數(shù),那么只傳入命名函數(shù)的名字,沒(méi)有括號(hào)。
作為參數(shù)排序案例:
作為返回值排序案例:
藍(lán)藍(lán)設(shè)計(jì)的小編 http://m.yvirxh.cn