javascript中call apply 的應(yīng)用場(chǎng)景
在一些jQuery插件中經(jīng)??吹筋?lèi)似 callback.call(xxx,xxx) 雖然看到書(shū)上有介紹 說(shuō)call和apply函數(shù)可以改變作用域,但還是無(wú)法非常透徹的理解改變作用域主要是為了解決什么問(wèn)題,有沒(méi)有替代方案,或者 這2個(gè)函數(shù)主要為了解決什么問(wèn)題,應(yīng)用場(chǎng)景,何時(shí)使用最合適,每次讀到這樣的代碼就暈了,一下子從線性閱讀中跳出去了,感覺(jué)有點(diǎn)繞
call和apply的作用很簡(jiǎn)單,就是改變上下文,適用場(chǎng)景太多了,雖然有時(shí)候只是為了“美觀”,下面幾個(gè)是我常用的。
1.
用來(lái)判斷 Obj 的類(lèi)型
arguments 雖然和Array 很像,但是他沒(méi)有Array的push之類(lèi)的方法,怎么辦?
Array.prototype.push.call(arguments)
3.Javascript 沒(méi)有私有方法的概念,想用閉包實(shí)現(xiàn)
(function () { var Person = function () { this.doSomeThing = function () { _privateFunction.call(this); } } var _privateFunction = function () { } window.Person = Person; }).call(window);
差不多就是這個(gè)意思,callback的時(shí)候,當(dāng)你希望你的callback中的上下文是當(dāng)前上下文的時(shí)候,也可以用call或者apply,有什么好處呢?
這個(gè)時(shí)候你的callback 里面的this 就是指代當(dāng)前上下文。例如一個(gè)類(lèi)Person,然后他的方法 say 有一個(gè)callback的參數(shù),如果這個(gè)callback是通過(guò)普通的括號(hào)來(lái)執(zhí)行的話,那在這個(gè)callback里面執(zhí)行person的其它方法還需要用person.other 來(lái)實(shí)現(xiàn),但是切換上下文之后,就是this.other搞定~代碼對(duì)比如下:
var Person = function(){ }; Person.prototype.say = function(callback){ callback(); }; Person.prototype.other = function(){ }; var vincent = new Person(); vincent.say(function(){ vincent.other(); });
用了call的:
var Person = function(){ }; Person.prototype.say = function(callback){ callback.call(this); }; Person.prototype.other = function(){ }; var vincent = new Person(); vincent.say(function(){ this.other(); });
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
Javascript類(lèi)庫(kù)的頂層對(duì)象名用戶體驗(yàn)分析
針對(duì)jQuery、Ext、KISSY三者類(lèi)庫(kù)的對(duì)比及分析已經(jīng)很多了,但多數(shù)是從功能和設(shè)計(jì)的角度切入,因此本篇文章決定換一個(gè)特殊的角度,從各類(lèi)庫(kù)的頂層對(duì)象名的鍵盤(pán)輸入的體驗(yàn)上來(lái)對(duì)這三個(gè)類(lèi)庫(kù)進(jìn)行比較。2010-10-10JavaScript的9個(gè)陷阱及評(píng)點(diǎn)分析
以下是JavaScript容易犯錯(cuò)的九個(gè)陷阱。雖然不是什么很高深的技術(shù)問(wèn)題,但注意一下,會(huì)使您的編程輕松些,即所謂make life easier. 筆者對(duì)某些陷阱會(huì)混雜一些評(píng)點(diǎn)。2008-05-05微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間位置
這篇文章主要介紹了微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間位置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03javascript創(chuàng)建數(shù)組的最簡(jiǎn)代碼
2008-02-02JS實(shí)現(xiàn)給不同元素設(shè)置不同的定時(shí)器
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)給不同元素設(shè)置不同的定時(shí)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07BootStrap Progressbar 實(shí)現(xiàn)大文件上傳的進(jìn)度條的實(shí)例代碼
這篇文章主要介紹了BootStrap Progressbar 實(shí)現(xiàn)大文件上傳的進(jìn)度條的實(shí)例代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06uniapp跨頁(yè)面?zhèn)髦祏ni.$emit和uni.$on的使用及踩坑實(shí)戰(zhàn)
使用uni.$emit觸發(fā)事件后,對(duì)應(yīng)的uni.$on就會(huì)監(jiān)聽(tīng)到事件觸發(fā),在回調(diào)中去執(zhí)行相關(guān)的邏輯,下面這篇文章主要給大家介紹了關(guān)于uniapp跨頁(yè)面?zhèn)髦祏ni.$emit和uni.$on的使用及踩坑實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考下2023-04-04JS簡(jiǎn)單實(shí)現(xiàn)自定義右鍵菜單實(shí)例
本篇文章主要介紹了JS簡(jiǎn)單實(shí)現(xiàn)自定義右鍵菜單實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05