亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript中call和apply函數的比較和使用實例

2019-11-20 13:14:43
字體:
來源:轉載
供稿:網友

一些簡單的Javascript操作中較少會用到call和apply函數,在另外一些較大型的操作中,如web應用開發,js框架開發中可能會經常遇到這兩個函數。關于這兩個函數的解釋,網上的資料也很多,但是本人認為很多資料要么照本宣科,要么高度雷同,缺少接地氣的解釋。接下來我試圖用更加清晰簡單的思路來分析解釋這兩個函數。

復制代碼 代碼如下:

我們可以將call()和apply()看做是某個對象的方法,通過調用方法的實行來間接調用函數。call()和apply()的第一個實參是要調用函數的母對象,它是調用上下文,在函數體內通過this來獲得對它的引用。要想對對象o的方法來調用函數f(), 可以這樣使用call()和apply(): f.call(o) f.apply(o).[1]

先來分析一下call,這里有ECMAScript 3rd Edition對call函數的解釋[2]:當call方法被一個function對象調用時(func.call(0)),需要傳入一個必須的參數和若干個非必須的參數,它的執行過程是這樣的:
a, 如果調用call的對象是不可運行的,拋出一個TypeError錯誤。
b, 設置參數列表為空
c, 如果被調用的方法傳入不止一個參數,那么依次把arg1,arg2…插入到參數列表里
d, 返回調用call的函數結果,把調用函數(func)中的this用傳入的參數1替換,把傳入的參數列表當作這個函數的參數。
實際上,call函數是function對象的原型,也就是說,當調用call的函數必須也是個函數,當調用這個call時,把調用call的函數中的this用傳入的對象替換就行了。下面有個例子:

<script> function C1(){ this.name='張三'; this.age='24'; this.sayname=function(){  console.log("這里是C1類,我的名字是:"+this.name+"我的年齡是"+this.age); } } function C2(){ this.name='李四'; this.age='25'; } var c1=new C1(); var c2=new C2(); c1.sayname(); c1.sayname.call(c2);</script>

執行結果:
這里是C1類,我的名字是:張三我的年齡是24
這里是C1類,我的名字是:李四我的年齡是25
上面的代碼中,聲明了兩個類,C1和C2,C1有兩個屬性,一個方法,C2也有兩個和C1一樣的屬性,實例化之后,c1.sayname()打印出了實際屬性,c1.sayname.call(c2)卻打印除了c2的屬性,為什么為這樣?因為sayname()是個函數,并且函數體內有this,當call執行的之后,this就會被c2代替,所以,最終會打印出c2的屬性。
apply和call的區別就在于可選參數的傳遞,apply的可選參數全部存放在一個數組當中,當成一個參數竄入而call是分成多個參數傳入。
那么,apply和call函數有哪些應用呢?第一個是網絡上比較經典的求數字數組中的最大元素,直接用Math.max.apply(null,array)即可,另外一個是可以用apply和call實現繼承,如下:

<script>  function Human(name,sex){ this.name=name; this.sex=sex; this.walk=function(){  console.log('我在走路'); } } function Child(){ Human.call(this,"小明","男") this.paly=function(){  console.log('我很喜歡玩耍'); } this.intruduce=function(){  console.log('大家好,我是'+this.name); } } var jinp=new Human('Jack','男'); var xiaoping=new Child(); xiaoping.walk(); xiaoping.paly(); xiaoping.intruduce();</script>

執行結果:
我在走路
我很喜歡玩耍
大家好,我是小明
與call()和apply()相似的函數是bind(), 它是在ECMAScript 5中新增的方法,但在ECMAScript 3中可以輕易的模擬bind()。bind函數一樣也是Javascript中Function.prototype的方法,這個方法的主要內容是將函數綁定至某個對象。當函數f()上綁定bind()方法并傳入一個對象o作為參數,這個方法將返回一個新的函數當作o的方法來調用。傳入新函數的任何實參都將傳入原始函數。如下:

<script> function introduce(country,hobby){ return "大家好,我叫"+this.name+", 今年"+this.age+"歲, 來自"+country+", 喜歡"+hobby; } var xiaoming={name:"小明",age:20} var jieshao=introduce.bind(xiaoming); console.log(jieshao("中國","打球"));</script>

執行結果:
大家好,我叫小明, 今年20歲, 來自中國, 喜歡打球
上面的例子等效于:

<script> function introduce(country,hobby){ return "大家好,我叫"+this.name+", 今年"+this.age+"歲, 來自"+country+", 喜歡"+hobby; } var xiaoming={name:"小明",age:20} console.log(introduce.apply(xiaoming,["中國","打球"]));    //或者下面這個 console.log(introduce.call(xiaoming,"中國","打球"));</script>

需要注意的是:在ECMAScript 5的嚴格模式中,call()和apply()的第一個實參都會變成this的值,哪怕傳入的實參是原始值甚至是null或者undefined。在ECMAScript 3和非嚴格模式中,傳入的null和undefined都會被全局對戲那個代替,而其他原始值會被相應的包裝對象所替代。

參考資料

[1], Javascript權威指南第6版,189頁
[2], Function.prototype.call (thisArg [ , arg1 [ , arg2, … ] ] )
[3], Function.prototype.apply (thisArg, argArray)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品二区三区线观看| 亚洲精品日韩丝袜精品| 97视频免费在线看| 日韩美女视频免费在线观看| 精品国产31久久久久久| 国产剧情久久久久久| 一区二区三区精品99久久| 国产精品成人一区二区三区吃奶| 在线观看久久av| 97av在线视频| 欧美激情精品久久久| 国语自产精品视频在线看抢先版图片| 欧美在线性爱视频| 国产欧美va欧美va香蕉在| 中文字幕日韩av综合精品| 亚洲色图国产精品| 久久亚洲精品一区| 国产九九精品视频| 97超级碰碰碰| 亚洲va欧美va国产综合久久| 国产精品第10页| 中文字幕亚洲在线| 精品国产91久久久| 日韩中文字幕视频在线观看| 欧美高清视频免费观看| 亚洲欧美国产va在线影院| 亚洲男人天天操| 中文字幕在线看视频国产欧美| 欧美性生活大片免费观看网址| 91九色国产视频| 亚洲天堂日韩电影| 国产中文字幕91| 日韩一区二区在线视频| 国产精品白丝av嫩草影院| 久久精品视频va| 国产精品69久久久久| 欧美日韩性视频在线| 国产精品高精视频免费| 欧美电影免费在线观看| 亚洲精品久久久久久久久久久| 亚洲va国产va天堂va久久| 2019亚洲日韩新视频| 精品呦交小u女在线| 亚洲女人天堂视频| 国产精品高潮粉嫩av| 久久久这里只有精品视频| 久久久影视精品| 国产亚洲人成网站在线观看| 亚洲一区免费网站| 欧美性videos高清精品| 久久亚洲精品成人| 欧美专区中文字幕| 亚洲精品www久久久久久广东| 久久免费视频网| 亚洲精品美女在线观看| 国产精品久久99久久| 久久久久国产精品免费网站| 日韩av一区在线观看| 欧美精品在线视频观看| 98精品国产高清在线xxxx天堂| 国产乱人伦真实精品视频| 精品亚洲一区二区三区在线观看| 久久久最新网址| 欧美国产日韩一区二区| 精品视频一区在线视频| 国产精品美女久久久久av超清| 欧美性理论片在线观看片免费| 久久久久这里只有精品| 91在线视频精品| 丝袜亚洲另类欧美重口| 国产极品精品在线观看| 国产精品男女猛烈高潮激情| 亚洲国产成人精品女人久久久| 久久精品最新地址| 亚洲精品国产精品国自产在线| 91免费福利视频| 久久99久久99精品中文字幕| 中文字幕日韩在线播放| 欧美成人精品一区二区三区| 日韩中文第一页| 国产一区二区三区在线观看视频| 亚洲欧美另类自拍| 国内精品视频一区| 欧美日韩一区二区免费视频| 午夜精品理论片| www日韩中文字幕在线看| 这里只有精品视频在线| 日韩久久精品电影| 日韩国产精品视频| 国产一区二区三区三区在线观看| 欧美日韩性生活视频| 精品女同一区二区三区在线播放| 亚洲bt天天射| 91丝袜美腿美女视频网站| 欧美性猛交xxxxx水多| 欧美另类暴力丝袜| 久久99亚洲热视| 日产精品久久久一区二区福利| 国产69久久精品成人看| 68精品国产免费久久久久久婷婷| 亚洲一区中文字幕在线观看| 日韩av一区二区在线观看| 久久av在线播放| 8050国产精品久久久久久| 欧美激情a在线| 91国偷自产一区二区三区的观看方式| 欧美激情免费在线| 国产日韩换脸av一区在线观看| 日韩视频免费在线观看| 国产精品va在线播放我和闺蜜| 欧美自拍视频在线观看| 亚洲国产婷婷香蕉久久久久久| 国产mv久久久| 日韩精品极品毛片系列视频| 91性高湖久久久久久久久_久久99| 亚洲天堂第一页| 国产一区二区三区欧美| 国内精品久久久久伊人av| 欧洲成人在线视频| 亚洲精品电影在线| 欧美性xxxx极品高清hd直播| 激情av一区二区| 国产精品久久久| 成人午夜在线视频一区| 国产精品99久久久久久白浆小说| 亚洲一区二区三区四区在线播放| 国产精品久久久久999| 超碰精品一区二区三区乱码| 欧美激情中文网| 精品色蜜蜜精品视频在线观看| 国内精品视频一区| 精品电影在线观看| 日本高清不卡的在线| 69久久夜色精品国产7777| 国产91色在线播放| 色综合老司机第九色激情| 亚洲深夜福利网站| 久久av资源网站| 青青草成人在线| 青青精品视频播放| 欧美性猛交xxxx乱大交3| 欧美激情一区二区三级高清视频| 中文字幕国产精品久久| 奇门遁甲1982国语版免费观看高清| 久久99精品久久久久久琪琪| 国产日产亚洲精品| 亚洲精品电影在线| 欧美成人三级视频网站| 国产精品人成电影在线观看| 91精品国产91久久久久久不卡| 久久中文字幕在线| 国产视频观看一区| 日韩中文字幕在线看| 国产99久久精品一区二区| 日韩精品免费一线在线观看| 亚洲尤物视频网| 97婷婷大伊香蕉精品视频| 亚洲加勒比久久88色综合| 日韩av理论片| 国自产精品手机在线观看视频| 亚州精品天堂中文字幕| 色吧影院999| 国产精品高清在线观看| 久久电影一区二区|