javascript中call apply 的應(yīng)用場景
在一些jQuery插件中經(jīng)常看到類似 callback.call(xxx,xxx) 雖然看到書上有介紹 說call和apply函數(shù)可以改變作用域,但還是無法非常透徹的理解改變作用域主要是為了解決什么問題,有沒有替代方案,或者 這2個(gè)函數(shù)主要為了解決什么問題,應(yīng)用場景,何時(shí)使用最合適,每次讀到這樣的代碼就暈了,一下子從線性閱讀中跳出去了,感覺有點(diǎn)繞
call和apply的作用很簡單,就是改變上下文,適用場景太多了,雖然有時(shí)候只是為了“美觀”,下面幾個(gè)是我常用的。
1.
用來判斷 Obj 的類型
arguments 雖然和Array 很像,但是他沒有Array的push之類的方法,怎么辦?
Array.prototype.push.call(arguments)
3.Javascript 沒有私有方法的概念,想用閉包實(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è)類Person,然后他的方法 say 有一個(gè)callback的參數(shù),如果這個(gè)callback是通過普通的括號(hào)來執(zhí)行的話,那在這個(gè)callback里面執(zhí)行person的其它方法還需要用person.other 來實(shí)現(xiàn),但是切換上下文之后,就是this.other搞定~代碼對比如下:
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(); });
以上所述就是本文的全部內(nèi)容了,希望大家能夠喜歡。
相關(guān)文章
JavaScript的9個(gè)陷阱及評點(diǎn)分析
以下是JavaScript容易犯錯(cuò)的九個(gè)陷阱。雖然不是什么很高深的技術(shù)問題,但注意一下,會(huì)使您的編程輕松些,即所謂make life easier. 筆者對某些陷阱會(huì)混雜一些評點(diǎn)。2008-05-05微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間位置
這篇文章主要介紹了微信小程序點(diǎn)擊item使之滾動(dòng)到屏幕中間位置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03javascript創(chuàng)建數(shù)組的最簡代碼
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跨頁面?zhèn)髦祏ni.$emit和uni.$on的使用及踩坑實(shí)戰(zhàn)
使用uni.$emit觸發(fā)事件后,對應(yīng)的uni.$on就會(huì)監(jiān)聽到事件觸發(fā),在回調(diào)中去執(zhí)行相關(guān)的邏輯,下面這篇文章主要給大家介紹了關(guān)于uniapp跨頁面?zhèn)髦祏ni.$emit和uni.$on的使用及踩坑實(shí)戰(zhàn)的相關(guān)資料,需要的朋友可以參考下2023-04-04JS簡單實(shí)現(xiàn)自定義右鍵菜單實(shí)例
本篇文章主要介紹了JS簡單實(shí)現(xiàn)自定義右鍵菜單實(shí)例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05