亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Javascript中call和apply函數(shù)的比較和使用實例

 更新時間:2015年02月03日 09:58:27   投稿:junjie  
這篇文章主要介紹了Javascript中call和apply函數(shù)的比較和使用實例,本文試圖用更加清晰簡單的思路來分析解釋這兩個函數(shù),需要的朋友可以參考下

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

復(fù)制代碼 代碼如下:

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

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

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

<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>

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

<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>

執(zhí)行結(jié)果:
大家好,我叫小明, 今年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的嚴(yán)格模式中,call()和apply()的第一個實參都會變成this的值,哪怕傳入的實參是原始值甚至是null或者undefined。在ECMAScript 3和非嚴(yán)格模式中,傳入的null和undefined都會被全局對戲那個代替,而其他原始值會被相應(yīng)的包裝對象所替代。

參考資料

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

相關(guān)文章

  • 基于Turn.js 實現(xiàn)翻書效果實例解析

    基于Turn.js 實現(xiàn)翻書效果實例解析

    最近項目經(jīng)理我個項目練練手,其項目需求是要實現(xiàn)翻書效果,看到這個需求后,我真是懵了,這咋整,我可是java出身的啊,這個問題真是難住我了,后來有同事的指導(dǎo),問題順利解決,下面小編把學(xué)習(xí)心得分享,感興趣的朋友可以參考下
    2016-06-06
  • javascript隱藏顯示div的兩種方式實例

    javascript隱藏顯示div的兩種方式實例

    這篇文章主要給大家介紹了關(guān)于javascript隱藏顯示div的兩種方式,實現(xiàn)的代碼很簡單,點擊時先判斷div是否是顯示,如果div是顯示就把div設(shè)置為隱藏,否則就變?yōu)轱@示,需要的朋友可以參考下
    2022-09-09
  • js異或運算符^小技巧分享

    js異或運算符^小技巧分享

    這篇文章主要介紹了js異或運算符^小技巧,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • js 利用image對象實現(xiàn)圖片的預(yù)加載提高訪問速度

    js 利用image對象實現(xiàn)圖片的預(yù)加載提高訪問速度

    我們來學(xué)習(xí)一種名為圖像預(yù)裝載(image preloading)的小技巧來提高圖像訪問速度,一些瀏覽器試圖通過在本地緩存中保存這些圖片來解決此問題,感興趣的朋友可以了解下
    2013-03-03
  • 對TypeScript庫進行單元測試的方法

    對TypeScript庫進行單元測試的方法

    這篇文章主要介紹了對TypeScript庫進行單元測試的方法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • Bootstrap中CSS的使用方法

    Bootstrap中CSS的使用方法

    這篇文章主要為大家詳細介紹了Bootstrap中CSS的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-02-02
  • ES6實現(xiàn)的遍歷目錄函數(shù)示例

    ES6實現(xiàn)的遍歷目錄函數(shù)示例

    這篇文章主要介紹了ES6實現(xiàn)的遍歷目錄函數(shù),涉及ES6文件目錄的遍歷、讀取、回調(diào)函數(shù)及json相關(guān)操作技巧,需要的朋友可以參考下
    2017-04-04
  • Js操作Select大全(取值、設(shè)置選中等等)

    Js操作Select大全(取值、設(shè)置選中等等)

    Js操作Select是很常見的,也是比較實用的,每一次操作select的時候,總是要出來翻一下資料,不如自己總結(jié)一下,以后就翻這里了
    2013-10-10
  • 使用ImageMagick進行圖片縮放、合成與裁剪(js+python)

    使用ImageMagick進行圖片縮放、合成與裁剪(js+python)

    由于需要在服務(wù)器端處理,使用就研究使用imagemagick來進行。同時準(zhǔn)備封裝了一個Node.js和Python的方法,主要還是講一下然后使用imagemagick來對圖片進行縮放、合成后進行裁剪吧
    2013-09-09
  • OpenLayer實現(xiàn)自定義坐標(biāo)點的繪制

    OpenLayer實現(xiàn)自定義坐標(biāo)點的繪制

    OpenLayers?是一個專為Web?GIS?客戶端開發(fā)提供的JavaScript?類庫包,用于實現(xiàn)標(biāo)準(zhǔn)格式發(fā)布的地圖數(shù)據(jù)訪問。本文將利用OpenLayer實現(xiàn)自定義坐標(biāo)點的繪制,感興趣的可以了解一下
    2022-04-04

最新評論