Javascript中call與apply的學(xué)習(xí)筆記
先看MDN中對(duì)于call的解釋
call() 方法在使用一個(gè)指定的this值和若干個(gè)指定的參數(shù)值的前提下調(diào)用某個(gè)函數(shù)或方法.
注:該方法的作用和 apply() 方法類(lèi)似,只有一個(gè)區(qū)別,就是call()方法接受的是若干個(gè)參數(shù)的列表,而apply()方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
語(yǔ)法
fun.call(thisArg[, arg1[, arg2[, ...]]])
參數(shù)
thisArg
在fun函數(shù)運(yùn)行時(shí)指定的this值。需要注意的是,指定的this值并不一定是該函數(shù)執(zhí)行時(shí)真正的this值,如果這個(gè)函數(shù)處于非嚴(yán)格模式下,則指定為null和undefined的this值會(huì)自動(dòng)指向全局對(duì)象(瀏覽器中就是window對(duì)象),同時(shí)值為原始值(數(shù)字,字符串,布爾值)的this會(huì)指向該原始值的自動(dòng)包裝對(duì)象。
arg1, arg2, ...
指定的參數(shù)列表。
MDN上的例子一開(kāi)始并不是很好理解,這里我貼出來(lái),有興趣可以自己去看看 call-Javascript
這里的thisArg解釋為在fun運(yùn)行時(shí)指定的this值,也就是說(shuō)使用了call后,fun中的this指向了thisArg?看代碼
var p="456"; function f1(){ this.p="123"; } function f2() { console.log(this.p); } f2(); //456 f2.call(f1()); //123 f2.apply(f1()); //123
第一次輸出是調(diào)用的全局變量,之后由于call和apply的使用,f2中的this指向了f1,因此,輸出變成了123,其實(shí)也就是f1借用了f2的方法輸出了自己的p
這時(shí)將f1()中的this.p刪除,會(huì)輸出三個(gè)456,也就證實(shí)了當(dāng)this為null或者undefined時(shí)其實(shí)指向了全局變量
至于指向原始值是指向它的包裝對(duì)象這里,由于我理解的包裝對(duì)象都是臨時(shí)的,而且測(cè)試時(shí)只輸出了原始值的類(lèi)型而不是object,這里如何證明如果有知道的朋友希望可以和我討論下,謝謝!
既然call可以實(shí)現(xiàn)一個(gè)對(duì)象借用另一個(gè)對(duì)象,不就可以實(shí)現(xiàn)繼承了么?看代碼
function f1(){ this.father="father" } function f2() { f1.call(this); this.child="child"; } var test=new f2(); console.log(test.father); //father
test中是沒(méi)有father的,由于f2()中的
f1.call(this);
這里的this指向的就是f2,也就是f2借用了f1的方法,其實(shí)也就實(shí)現(xiàn)了繼承
下面講一下這里的參數(shù),這里的參數(shù)是傳遞給fun的,看代碼吧
function f1(){ this.p="123"; } function f2(x) { console.log(this.p); console.log(x); } f2.call(f1(),456); //123 //456
先輸出123是因?yàn)閒1中的p,之后的456是傳遞給f2的參數(shù),很容易理解
主要是注意call和apply中參數(shù)的區(qū)別
call是一個(gè)一個(gè)傳入的,而apply是傳入的一個(gè)數(shù)組
function f1(){ this.p="測(cè)試call"; } function f2(x,y,z) { console.log(this.p); console.log(x); console.log(y); console.log(z); } function f3(){ this.p="測(cè)試apply"; } f2.call(f1(),4,5,6); f2.call(f1(),[4,5,6]); f2.apply(f3(),[4,5,6]); f2.apply(f3(),4,5,6);
這里可以看到結(jié)果
第一段測(cè)試call是正確輸出
第二段測(cè)試call由于傳入數(shù)組,所以先輸出一個(gè)數(shù)組然后兩個(gè)undefined
第三段測(cè)試apply正確輸出
第四段由于參數(shù)格式錯(cuò)誤直接報(bào)錯(cuò)
這里的區(qū)別應(yīng)該很明顯了
相關(guān)文章
JavaScript如何將時(shí)間戳轉(zhuǎn)化為年月日時(shí)分秒格式
這篇文章主要給大家介紹了關(guān)于JavaScript如何將時(shí)間戳轉(zhuǎn)化為年月日時(shí)分秒格式的相關(guān)資料,在前端的日常工作當(dāng)中,時(shí)間戳的使用也是不少的,有時(shí)后端返回給我們的數(shù)據(jù)是一個(gè)時(shí)間戳,我們需要轉(zhuǎn)換成年月日,時(shí)分秒的形式展示在頁(yè)面當(dāng)中,需要的朋友可以參考下2023-11-11javascript 處理HTML元素必須避免使用的一種方法
我們?cè)诰帉?xiě)前臺(tái)頁(yè)面的時(shí)候,可能經(jīng)常會(huì)用到“javascript+數(shù)據(jù)”生成頁(yè)面元素的方法,但當(dāng)我們要處理的數(shù)據(jù)量較大,導(dǎo)致頁(yè)面需要展現(xiàn)過(guò)多的控件的時(shí)候,頁(yè)面的響應(yīng)速度也會(huì)直線下降2009-07-07JavaScript實(shí)現(xiàn)的經(jīng)典文件樹(shù)菜單效果
這篇文章主要介紹了JavaScript實(shí)現(xiàn)的經(jīng)典文件樹(shù)菜單效果,通過(guò)JavaScript結(jié)合json數(shù)組實(shí)現(xiàn)文件樹(shù)菜單的效果,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-09-09JavaScript在網(wǎng)頁(yè)中畫(huà)圓的函數(shù)arc使用方法
這篇文章主要介紹了JavaScript在網(wǎng)頁(yè)中畫(huà)圓的函數(shù)arc使用方法的相關(guān)資料,需要的朋友可以參考下2015-11-11原生js的ajax和解決跨域的jsonp(實(shí)例講解)
下面小編就為大家?guī)?lái)一篇原生js的ajax和解決跨域的jsonp(實(shí)例講解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10