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

資訊專欄INFORMATION COLUMN

快速理解JavaScript中apply()和call()的用法和用途

chenjiang3 / 1157人閱讀

摘要:在學(xué)習(xí)之前,我們必須對(duì)的作用和使用方法有所了解,可以參考我前一篇文章快速理解中的用法與陷阱。和的作用十分相似,只是參數(shù)類型上的差別,以適應(yīng)不同的使用場景。

在學(xué)習(xí)apply()之前,我們必須對(duì)this的作用和使用方法有所了解,可以參考我前一篇文章《快速理解JavaScript中this的用法與陷阱》。當(dāng)然如果你已經(jīng)熟悉this的相關(guān)知識(shí),那么請(qǐng)直接往下看。

call()apply()的作用十分相似,只是參數(shù)類型上的差別,以適應(yīng)不同的使用場景。它們都是為了改變函數(shù)運(yùn)行時(shí)的 context(上下文)而存在的,再說的直白一點(diǎn),就是為了改變函數(shù)內(nèi)部 this 的指向。

恩?什么?我似乎聽到你說改變this的指向??那就是說。。。

沒錯(cuò)!這樣就可以實(shí)現(xiàn)繼承啦!Exciting!

看下面的代碼:

以下代碼必須看過《瘋狂動(dòng)物城》才可看懂(逃)

function animal(name,food) {
   this.name = name,
    this.food = food,
   this.say = function() {
        console.log(name +" likes " + this.food + ".");
   }
}

function rabbit(name,food) {
   animal.call(this,name,food);
}

var Judy = new rabbit("Judy","carrot");

Judy.say();// >>> Judy likes carrot.

可以看出,我們聲明了一個(gè)叫Judy的對(duì)象,我們并沒有在rabbit對(duì)象里添加任何屬性和方法,但是我們使用call()繼承了原本屬于animal的屬性和方法。就可以做到animal函數(shù)所有能做到的事情。

這到底是怎么做到的呢?讓我們來看看call()的參數(shù):
第一個(gè)是一個(gè)對(duì)象,這個(gè)對(duì)象將代替Function類里原本的this對(duì)象,我們傳入的是this,記住,這個(gè)thisrabbit函數(shù)里指的是未來將要實(shí)例化這個(gè)函數(shù)的對(duì)象(我知道這有些拗口),當(dāng)聲明了Judy的時(shí)候,這個(gè)this指的就是Judy。
除了第一個(gè)參數(shù),后面所有的參數(shù)都是傳給父函數(shù)本身使用的參數(shù)。

apply()call()功能幾乎一樣,唯一的區(qū)別就是apply()第二個(gè)參數(shù)只能是數(shù)組,這個(gè)數(shù)組將作為參數(shù)傳給原函數(shù)的參數(shù)列表arguments。

其實(shí)在實(shí)際開發(fā)中,JS 繼承的方法并不止這一種,使用原型鏈繼承是更加常用的方式,此外還有構(gòu)造函數(shù)繼承,這里不展開。而apply使用的場景,更多的使用在這樣一個(gè)場景:

需要將數(shù)組轉(zhuǎn)化為參數(shù)列表。

apply()的這個(gè)把數(shù)組轉(zhuǎn)化為參數(shù)列表的特性,可以讓它做一些有趣的事情。

例如,push()方法的參數(shù)只能是一個(gè)或者多個(gè)參數(shù),而不能是一個(gè)數(shù)組,當(dāng)我們想要將數(shù)組B拼接到數(shù)組A后面時(shí),傳統(tǒng)的做法是遍歷數(shù)組B,每循環(huán)一次就push進(jìn)數(shù)組A后面,這樣就浪費(fèi)了push()可以傳多個(gè)參數(shù)的功能。
我們可以這樣做:

var list1 = [0,1,2];
var list2 = [3,4,5];
[].push.apply(list1,list2);

console.log(list1);// >>> [0,1,2,3,4,5]

看起來有點(diǎn)糊涂嗎?可以這樣理解:
list1調(diào)用了屬于數(shù)組對(duì)象的push方法,這個(gè)push方法需要傳入一個(gè)參數(shù)列表,而恰好我們有了list2這個(gè)數(shù)組類型的參數(shù)列表,實(shí)現(xiàn)了拼接操作。
第三行就相當(dāng)于:

list1.push(3,4,5);

看,apply多么神奇!同樣的,Math對(duì)象下的max()min()等方法都只支持參數(shù)列表而不是數(shù)組,能做什么事情,你應(yīng)該猜到了吧?

此外還有許多地方apply()的這個(gè)特性帶來很多便利:比如函數(shù)式編程中的currying(柯里化)apply()都有著不可或缺的作用。

既然說到這,那下一篇文章我就帶大家認(rèn)識(shí)函數(shù)柯里化。今天有點(diǎn)晚了,先休息啦~

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

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

相關(guān)文章

  • JavaScript 函數(shù)作用域、執(zhí)行環(huán)境(this)、callapply、bind 用法

    摘要:什么是函數(shù)的作用域函數(shù)作用域在中,作用域?yàn)榭稍L問變量,對(duì)象,函數(shù)的集合。函數(shù)作用域作用域在函數(shù)內(nèi)修改。與函數(shù)又有什么關(guān)系呢對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的。 什么是函數(shù)的作用域 函數(shù)作用域:在 JavaScript 中,作用域?yàn)榭稍L問變量,對(duì)象,函數(shù)的集合。JavaScript 函數(shù)作用域: 作用域在函數(shù)內(nèi)修改。 this 與函數(shù)又有什么關(guān)系呢? this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的...

    1fe1se 評(píng)論0 收藏0
  • JavaScript也玩私人訂制——玩轉(zhuǎn)函數(shù)柯里化

    摘要:而柯里化是一個(gè)屬于函數(shù)式編程的一個(gè)常見的技巧。簡單來說,函數(shù)柯里化就是對(duì)高階函數(shù)的降階處理。讓你意外的是,這就是柯里化的基本思想,簡單地讓人猝不及防。 函數(shù)式編程是一種被部分JavaScript程序員推崇的編程風(fēng)格,更別說 Haskell 和 Scala 這種以函數(shù)式為教義的語言。原因是因?yàn)槠淠苡幂^短的代碼實(shí)現(xiàn)功能,如果掌握得當(dāng),能達(dá)到代碼文檔化(代碼本身具有很高可讀性甚至可以代替文檔...

    MRZYD 評(píng)論0 收藏0
  • 「前端面試題系列6」理解函數(shù)柯里化

    摘要:原題如下寫一個(gè)方法,當(dāng)使用下面的語法調(diào)用時(shí),能正常工作這道題要考察的,就是對(duì)函數(shù)柯里化的理解。當(dāng)參數(shù)只有一個(gè)的時(shí)候,進(jìn)行柯里化的處理。這其實(shí)就是函數(shù)柯里化的簡單應(yīng)用。 showImg(https://segmentfault.com/img/bVbopGm?w=620&h=350); 前言 這是前端面試題系列的第 6 篇,你可能錯(cuò)過了前面的篇章,可以在這里找到: ES6 中箭頭函數(shù)的...

    liaorio 評(píng)論0 收藏0
  • Know this, use this! (總結(jié) this 常見用法)

    摘要:而當(dāng)做普通函數(shù)調(diào)用的話,實(shí)際上即第種情況下,對(duì)函數(shù)普通調(diào)用,此時(shí)的指向這是正常情況下,會(huì)正確返回并且指向該對(duì)象,但是在構(gòu)造函數(shù)當(dāng)中,如果返回了一個(gè)對(duì)象,那么會(huì)指向返回的那個(gè)對(duì)象。 this應(yīng)該是一個(gè)討論了很久的話題了。其中,關(guān)于this的文章,在很多的博客當(dāng)中也有很多介紹,但是,以前我都是一知半解的去了解它,就是看博客當(dāng)中,只介紹了一些情況下的 this 的使用方式,但是也并沒有自己去...

    zorro 評(píng)論0 收藏0
  • 學(xué)習(xí)JavaScript之this,call,apply

    摘要:在全局對(duì)象中調(diào)用,自然讀取的是全局對(duì)象的值構(gòu)造器調(diào)用說明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對(duì)象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門花了一天,來弄懂JavaScript的this,call,apply。中途參考的書籍也很多,以...

    wenhai.he 評(píng)論0 收藏0

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<