成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

深入JavaScript之call和apply方法

joywek / 2668人閱讀

摘要:難兄難弟我是里的方法,我和方法是難兄難弟。有些地方?jīng)]有咱倆還真不行。我可以改變被調(diào)用方法內(nèi)部的指向指向第一個(gè)參數(shù)。這個(gè)時(shí)候我方法就無(wú)能為力了,只能讓幫你了也可以使用運(yùn)算符最后我們這對(duì)難兄難弟其實(shí)一點(diǎn)也不難啊

難兄難弟

我是js里的call方法,我和apply方法是難兄難弟。為什么這么說(shuō)呢,因?yàn)楹芏嗲岸诵“卓吹皆蹅z就犯怵: "WTF!這是什么方法,根本看不懂??!"然后去谷歌去百度,回來(lái)還是:"WTF!還是沒(méi)懂!"。然后就把咱倆丟在一邊不管了,心想:"哎,能不用就不用吧,反正也不見(jiàn)得用得著"。

借過(guò)來(lái)玩一玩

其實(shí)只要你認(rèn)真的研究一下, 就會(huì)發(fā)現(xiàn)我和我哥們一點(diǎn)也不難。有些地方?jīng)]有咱倆還真不行。要說(shuō)咱倆有啥用,我管咱倆的功能叫借過(guò)來(lái)玩一玩。你看下面的例子?。?/p>

let cat = {
    food: "fish",
    eat: function() {
        console.log("I want to eat " + this.food);
    },
   sleep: function(time) {
      console.log("I sleep" + time);
   }
}
let dog = {
    food: "bone",
    playBall: function() {
        console.log("I am a doggy, I love playing ball");
    }
}
dog.playBall();    //I am a doggy, I love playing ball
cat.eat();    //I want to eat fish
cat.eat.call(dog);   //I want to eat bone

喵星人那里定義了eat方法,而汪星人里邊只定義了playBall方法,懶惰的汪星人不想在自己內(nèi)部再定義一個(gè)重復(fù)的eat方法,但是又想吃吃吃,那怎么辦呢?
當(dāng)然就是通過(guò)我call方法來(lái)找喵星人把eat方法借過(guò)來(lái)玩一玩啦。所以呢:
cat.eat.call(dog);的意思就是:喵哥!你的eat方法借dog玩一玩唄!你那個(gè)eat方法里的this現(xiàn)在指向了dog了啊!
這下你明白了為啥我的功能是借過(guò)來(lái)玩一玩了吧:
1.沒(méi)有的方法我去別人那里借。
2.我可以改變被調(diào)用方法內(nèi)部的this指向, this指向第一個(gè)參數(shù)。

除此之外,你可能會(huì)問(wèn)了,假如我要調(diào)用的函數(shù)要接收參數(shù),要怎么辦呢?那么可以用到我call方法接收的第2,3,4...個(gè)參數(shù)了!

  cat.sleep.call(dog, "all day"); //I sleep all day
我和我哥們apply的區(qū)別

我和我哥們apply區(qū)別很小很小,因?yàn)樵蹅z的主要功能都是一樣的,都是借方法過(guò)來(lái)玩一玩外加改變this的指向,咱倆唯一的不同在于:
對(duì)于要借過(guò)來(lái)玩一玩的函數(shù):

 function myFunction(arg1, arg2, arg3, arg4) {
    console.log(arg1);
    console.log(arg2);
    console.log(arg3);
    console.log(arg4);
}

我call的使用方法是myFunction.call(null, "1", "2", "3", "4")
而apply的使用方法是myFunction.apply(null, ["1", "2", "3", "4"])
看出來(lái)了么,apply這哥們有強(qiáng)迫癥!他要把傳進(jìn)去的參數(shù)用數(shù)組包起來(lái)!而我就是一個(gè)一個(gè)往里傳。你要是怕記混咱倆,你就這么記: 我是call,call就是打電話啊,打電話不得一個(gè)一個(gè)打嗎,所以我的參數(shù)是一個(gè)個(gè)獨(dú)立的。

這區(qū)別有啥用???

你可能又要問(wèn)了:既然你倆區(qū)別這么小,而且看你上面的例子,既能用call又能用apply,那你倆這區(qū)別有啥用?。?br>嘿嘿嘿,當(dāng)然有用啦,看我給你舉個(gè)栗子?。?/p>

//這個(gè)函數(shù)熟悉吧?求傳入?yún)?shù)的最大值
Math.max(1, 2, 3); //3

如果你是想求一個(gè)數(shù)組中的最大值, 咋辦?把數(shù)組傳入Math.max?當(dāng)然不行,不信的話你可以試一下。這個(gè)時(shí)候我call方法就無(wú)能為力了,只能讓apply幫你了:

let myArray = [1, 2, 3];
Math.max.apply(null, myArray);

ps: 也可以使用...運(yùn)算符Math.max(...myArray);

最后

我們這對(duì)難兄難弟其實(shí)一點(diǎn)也不難?。?╯﹏╰)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89293.html

相關(guān)文章

  • 深入淺出JavaScriptcall()、apply()方法

    摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說(shuō)就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫在前面: 隔了很長(zhǎng)時(shí)間了,也不知道寫點(diǎn)什么。最近一直在研究ES6,一直想寫出來(lái)的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...

    Cympros 評(píng)論0 收藏0
  • JavaScript深入callapply的模擬實(shí)現(xiàn)

    摘要:深入系列第十篇,通過(guò)和的模擬實(shí)現(xiàn),帶你揭開(kāi)和改變的真相一句話介紹方法在使用一個(gè)指定的值和若干個(gè)指定的參數(shù)值的前提下調(diào)用某個(gè)函數(shù)或方法。如果有錯(cuò)誤或者不嚴(yán)謹(jǐn)?shù)牡胤?,?qǐng)務(wù)必給予指正,十分感謝。 JavaScript深入系列第十篇,通過(guò)call和apply的模擬實(shí)現(xiàn),帶你揭開(kāi)call和apply改變this的真相 call 一句話介紹 call: call() 方法在使用一個(gè)指定的 this...

    miya 評(píng)論0 收藏0
  • JavaScript深入bind的模擬實(shí)現(xiàn)

    摘要:也就是說(shuō)當(dāng)返回的函數(shù)作為構(gòu)造函數(shù)的時(shí)候,時(shí)指定的值會(huì)失效,但傳入的參數(shù)依然生效。構(gòu)造函數(shù)效果的優(yōu)化實(shí)現(xiàn)但是在這個(gè)寫法中,我們直接將,我們直接修改的時(shí)候,也會(huì)直接修改函數(shù)的。 JavaScript深入系列第十一篇,通過(guò)bind函數(shù)的模擬實(shí)現(xiàn),帶大家真正了解bind的特性 bind 一句話介紹 bind: bind() 方法會(huì)創(chuàng)建一個(gè)新函數(shù)。當(dāng)這個(gè)新函數(shù)被調(diào)用時(shí),bind() 的第一個(gè)參數(shù)...

    FingerLiu 評(píng)論0 收藏0
  • JavaScript 深入 call apply 的模擬實(shí)現(xiàn)

    摘要:第一版首先要獲取調(diào)用的函數(shù),用可以獲取的指向?yàn)?,因?yàn)槭堑膶?shí)例相當(dāng)于把掛載到上,所以可以取到測(cè)試一下但是第一版不可以傳遞多個(gè)參數(shù)第二版這里會(huì)自動(dòng)調(diào)用這個(gè)方法。 // 第一版 Function.prototype.call2 = function(context) { // 首先要獲取調(diào)用call的函數(shù),用this可以獲取 // this的指向?yàn)閎ar,因?yàn)閎ar是Func...

    邱勇 評(píng)論0 收藏0
  • JavaScript深入new的模擬實(shí)現(xiàn)

    摘要:深入系列第十二篇,通過(guò)的模擬實(shí)現(xiàn),帶大家揭開(kāi)使用獲得構(gòu)造函數(shù)實(shí)例的真相一句話介紹運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類型之一也許有點(diǎn)難懂,我們?cè)谀M之前,先看看實(shí)現(xiàn)了哪些功能。 JavaScript深入系列第十二篇,通過(guò)new的模擬實(shí)現(xiàn),帶大家揭開(kāi)使用new獲得構(gòu)造函數(shù)實(shí)例的真相 new 一句話介紹 new: new 運(yùn)算符創(chuàng)建一個(gè)用戶定義的對(duì)象類型的實(shí)例或具...

    tianlai 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<