<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當(dāng)前位置: 首頁 - 科技 - 知識百科 - 正文

        在JavaScript中高級函數(shù)的使用方法

        來源:懂視網(wǎng) 責(zé)編:小OO 時間:2020-11-27 19:37:20
        文檔

        在JavaScript中高級函數(shù)的使用方法

        在JavaScript中,函數(shù)的功能十分強大。它們是第一類對象,也可以作為另一個對象的方法,還可以作為參數(shù)傳入另一個函數(shù),不僅如此,還能被一個函數(shù)返回。可以說,在JS中,函數(shù)無處不在,無所不能,堪比孫猴子呀。當(dāng)你運用好函數(shù)時,它能助你取西經(jīng),讓代碼變得優(yōu)雅簡潔,運用不好時,那就遭殃了,要大鬧天宮咯~。除了函數(shù)相關(guān)的基礎(chǔ)知識外,掌握一些高級函數(shù)并應(yīng)用起來,不僅能讓JS代碼看起來更為精簡,還可以提升性能。以下是小編總結(jié)的一些常用的、重要的高級函數(shù),加上了一些個人見解,特此記錄下來。如果您是JS初學(xué)者,也不要被“高級”兩個字嚇到,因為文中穿插講解了一些原型、this等基礎(chǔ)知識,相信并不難理解。如果您是JS大牛,也可以把本文用來查漏補缺。正文;作用域安全的構(gòu)造函數(shù)。
        推薦度:
        導(dǎo)讀在JavaScript中,函數(shù)的功能十分強大。它們是第一類對象,也可以作為另一個對象的方法,還可以作為參數(shù)傳入另一個函數(shù),不僅如此,還能被一個函數(shù)返回。可以說,在JS中,函數(shù)無處不在,無所不能,堪比孫猴子呀。當(dāng)你運用好函數(shù)時,它能助你取西經(jīng),讓代碼變得優(yōu)雅簡潔,運用不好時,那就遭殃了,要大鬧天宮咯~。除了函數(shù)相關(guān)的基礎(chǔ)知識外,掌握一些高級函數(shù)并應(yīng)用起來,不僅能讓JS代碼看起來更為精簡,還可以提升性能。以下是小編總結(jié)的一些常用的、重要的高級函數(shù),加上了一些個人見解,特此記錄下來。如果您是JS初學(xué)者,也不要被“高級”兩個字嚇到,因為文中穿插講解了一些原型、this等基礎(chǔ)知識,相信并不難理解。如果您是JS大牛,也可以把本文用來查漏補缺。正文;作用域安全的構(gòu)造函數(shù)。

        在JavaScript中,函數(shù)的功能十分強大,除了函數(shù)相關(guān)的基礎(chǔ)知識外,掌握一些高級函數(shù)并應(yīng)用起來,不僅能讓JS代碼看起來更為精簡,還可以提升性能,本文是小編總結(jié)的一些常用的、重要的函數(shù)

        在JavaScript中,函數(shù)的功能十分強大。它們是第一類對象,也可以作為另一個對象的方法,還可以作為參數(shù)傳入另一個函數(shù),不僅如此,還能被一個函數(shù)返回!可以說,在JS中,函數(shù)無處不在,無所不能,堪比孫猴子呀!當(dāng)你運用好函數(shù)時,它能助你取西經(jīng),讓代碼變得優(yōu)雅簡潔,運用不好時,那就遭殃了,要大鬧天宮咯~

        除了函數(shù)相關(guān)的基礎(chǔ)知識外,掌握一些高級函數(shù)并應(yīng)用起來,不僅能讓JS代碼看起來更為精簡,還可以提升性能。以下是小編總結(jié)的一些常用的、重要的高級函數(shù),加上了一些個人見解,特此記錄下來。如果您是JS初學(xué)者,也不要被“高級”兩個字嚇到,因為文中穿插講解了一些原型、this等基礎(chǔ)知識,相信并不難理解。如果您是JS大牛,也可以把本文用來查漏補缺。

        正文

        作用域安全的構(gòu)造函數(shù)

        function Person(name,age){
         this.name = name;
         this.age = age;
        }
        var p1 = new Person("Claiyre",80);

        相信您對上面的構(gòu)造函數(shù)一定不陌生,但是,,如果某個粗心的程序猿調(diào)用這個構(gòu)造函數(shù)時忘記加 new 了會發(fā)生什么?

        var p3 = Person("Tom",30);
        console.log(p3); //undefined
        console.log(window.name); //Tom

        由于使用了不安全的構(gòu)造函數(shù),上面的代碼意外的改變了window的name,因為 this 對象是在運行時綁定的,使用new調(diào)用構(gòu)造函數(shù)時 this 是指向新創(chuàng)建的對象的,不使用 new 時, this 是指向window的。

        由于window的name屬性是用來識別鏈接目標(biāo)和frame的,所在這里對該屬性的偶然覆蓋可能導(dǎo)致其他錯誤。

        作用域安全的構(gòu)造函數(shù)會首先確認(rèn) this 對象是正確類型的實例,然后再進(jìn)行更改,如下:

        function Person(name,age){
         if(this instanceof Person){
         this.name = name;
         this.age = age;
         } else {
         return new Person(name,age);
         } 
        }

        這樣就避免了在全局對象上意外更改或設(shè)置屬性。

        實現(xiàn)這個安全模式,相當(dāng)于鎖定了調(diào)用構(gòu)造函數(shù)的環(huán)境,因此借用構(gòu)造函數(shù)繼承模式可能會出現(xiàn)問題,解決方法是組合使用原型鏈和構(gòu)造函數(shù)模式,即組合繼承。

        如果您是一個JS庫或框架的開發(fā)者,相信作用域安全的構(gòu)造函數(shù)一定對您非常有用。在多人協(xié)作的項目中,為了避免他們誤改了全局對象,也應(yīng)使用作用域安全的構(gòu)造函數(shù)。

        惰性載入函數(shù)

        由于瀏覽器間的行為差異,代碼中可能會有許多檢測瀏覽器行為的if語句。但用戶的瀏覽器若支持某一特性,便會一直支持,所以這些if語句,只用被執(zhí)行一次,即便只有一個if語句的代碼,也比沒有要快。

        惰性載入表示函數(shù)執(zhí)行的分支僅會執(zhí)行一次,有兩種實現(xiàn)惰性載入的方式,第一種就是在函數(shù)第一次被調(diào)用時再處理函數(shù),用檢測到的結(jié)果重寫原函數(shù)。

        function detection(){
         if(//支持某特性){
         detection = function(){
         //直接用支持的特性
         }
         } else if(//支持第二種特性){
         detection = function(){
         //用第二種特性
         }
         } else {
         detection = function(){
         //用其他解決方案
         }
         }
        }

        第二種實現(xiàn)惰性載入的方式是在聲明函數(shù)時就指定適當(dāng)?shù)暮瘮?shù)

        var detection = (function(){
         if(//支持某特性){
         return function(){
         //直接用支持的特性
         }
         } else if(//支持第二種特性){
         return function(){
         //用第二種特性
         }
         } else {
         return function(){
         //用其他解決方案
         }
         } 
        })();

        惰性載入函數(shù)的有點是在只初次執(zhí)行時犧牲一點性能,之后便不會再有多余的消耗性能。

        函數(shù)綁定作用域

        在JS中,函數(shù)的作用域是在函數(shù)被調(diào)用時動態(tài)綁定的,也就是說函數(shù)的this對象的指向是不定的,但在一些情況下,我們需要讓某一函數(shù)的執(zhí)行作用域固定,總是指向某一對象。這時怎么辦呢?

        當(dāng)當(dāng)當(dāng)~~可以用函數(shù)綁定作用域函數(shù)呀

        function bind(fn,context){
         return function(){
         return fn.apply(context,arguments);
         }
        }

        用法:

        var person1 = {
         name: "claiyre",
         sayName: function(){
         alert(this.name);
         }
        }
        var sayPerson1Name = bind(person1.sayName,person1);
        sayPerson1Name(); //claiyre

        call 函數(shù)和 apply 函數(shù)可以臨時改變函數(shù)的作用域,使用bind函數(shù)可以得到一個綁定了作用域的函數(shù)

        函數(shù)柯里化(curry)

        curry的概念很簡單:只傳遞部分參數(shù)來調(diào)用函數(shù),然后讓函數(shù)返回另一個函數(shù)去處理剩下的參數(shù)??梢岳斫鉃橘x予了函數(shù)“加載”的能力。

        許多js庫中都封裝了curry函數(shù),具體使用可以這樣。

        var match = curry(function(what,str){
         return str.match(what)
        }); 
        var hasNumber = match(/[0-9]+/g);
        var hasSpace = match(/\s+/g)
        hasNumber("123asd"); //['123']
        hasNumber("hello world!"); //null
        hasSpace("hello world!"); //[' '];
        hasSpace("hello"); //null
        console.log(match(/\s+/g,'i am Claiyre')); //直接全部傳參也可: [' ',' ']

        一旦函數(shù)經(jīng)過柯里化,我們就可以先傳遞部分參數(shù)調(diào)用它,然后得到一個更具體的函數(shù)。這個更具體的函數(shù)通過閉包幫我們記住了第一次傳遞的參數(shù),最后我們就可以用這個更具體的函數(shù)為所欲為啦~

        一個較為簡單的實現(xiàn)curry的方式:

        function curry(fn){
         var i = 0;
         var outer = Array.prototype.slice.call(arguments,1);
         var len = fn.length;
         return function(){
         var inner = outer.concat(Array.prototype.slice.call(arguments));
         return inner.length === len?fn.apply(null,inner):function (){
         var finalArgs = inner.concat(Array.prototype.slice.call(arguments));
         return fn.apply(null,finalArgs);
         }
         }
        }

        debounce函數(shù)

        debounce函數(shù),又稱“去抖函數(shù)”。它的功能也很簡單直接,就是防止某一函數(shù)被連續(xù)調(diào)用,從而導(dǎo)致瀏覽器卡死或崩潰。用法如下:

        var myFunc = debounce(function(){
         //繁重、耗性能的操作
        },250);
        window.addEventListener('resize',myFunc);

        像窗口的resize,這類可以以較高的速率觸發(fā)的事件,非常適合用去抖函數(shù),這時也可稱作“函數(shù)節(jié)流”,避免給瀏覽器帶來過大的性能負(fù)擔(dān)。

        具體的實現(xiàn)時,當(dāng)函數(shù)被調(diào)用時,不立即執(zhí)行相應(yīng)的語句,而是等待固定的時間w,若在w時間內(nèi),即等待還未結(jié)束時,函數(shù)又被調(diào)用了一次,則再等待w時間,重復(fù)上述過程,直到最后一次被調(diào)用后的w時間內(nèi)該函數(shù)都沒有被再調(diào)用,則執(zhí)行相應(yīng)的代碼。

        實現(xiàn)代碼如下:

        function debounce(fn,wait){
         var td;
         return function(){
         clearTimeout(td);
         td= setTimeout(fn,wait);
         }
        }

        once函數(shù)

        顧名思義,once函數(shù)是僅僅會被執(zhí)行一次的函數(shù)。具體實現(xiàn)如下:

        function once(fn){
         var result;
         return function(){
         if(fn){
         result = fn(arguments);
         fn = null;
         }
         return result;
         }
        }
        var init = once(function(){
         //初始化操作
        })

        在被執(zhí)行過一次后,參數(shù)fn就被賦值null了,那么在接下來被調(diào)用時,便再也不會進(jìn)入到if語句中了,也就是第一次被調(diào)用后,該函數(shù)永遠(yuǎn)不會被執(zhí)行了。

        還可以對上述once函數(shù)進(jìn)行改進(jìn),不僅可以傳入函數(shù),同時還可以給傳入的函數(shù)綁定作用域u,同時實現(xiàn)了bind和once。

        function once(fn,context){
         var result;
         return function(){
         if(fn){
         result = fn.apply(context,arguments);
         fn = null;
         }
         return result;
         }
        }

        上面是我整理給大家的,希望今后會對大家有幫助。

        相關(guān)文章:

        在vue中如何引用阿里字體圖標(biāo)的方法

        有關(guān)Express中l(wèi)og4js實際用法

        使用NodeJS如何實現(xiàn)WebSocket功能

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        在JavaScript中高級函數(shù)的使用方法

        在JavaScript中,函數(shù)的功能十分強大。它們是第一類對象,也可以作為另一個對象的方法,還可以作為參數(shù)傳入另一個函數(shù),不僅如此,還能被一個函數(shù)返回??梢哉f,在JS中,函數(shù)無處不在,無所不能,堪比孫猴子呀。當(dāng)你運用好函數(shù)時,它能助你取西經(jīng),讓代碼變得優(yōu)雅簡潔,運用不好時,那就遭殃了,要大鬧天宮咯~。除了函數(shù)相關(guān)的基礎(chǔ)知識外,掌握一些高級函數(shù)并應(yīng)用起來,不僅能讓JS代碼看起來更為精簡,還可以提升性能。以下是小編總結(jié)的一些常用的、重要的高級函數(shù),加上了一些個人見解,特此記錄下來。如果您是JS初學(xué)者,也不要被“高級”兩個字嚇到,因為文中穿插講解了一些原型、this等基礎(chǔ)知識,相信并不難理解。如果您是JS大牛,也可以把本文用來查漏補缺。正文;作用域安全的構(gòu)造函數(shù)。
        推薦度:
        標(biāo)簽: 中的 使用 js
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产成人综合亚洲AV第一页| 全黄性性激高免费视频| 亚洲中文字幕无码久久2017| 搜日本一区二区三区免费高清视频| 女人与禽交视频免费看| 亚洲自偷自偷在线成人网站传媒| 99久久综合国产精品免费| 香蕉大伊亚洲人在线观看| 天堂在线免费观看中文版| 亚洲精品9999久久久久无码 | 真正全免费视频a毛片| 好男人看视频免费2019中文 | 在线观看成人免费视频不卡| 亚洲精品影院久久久久久| 四虎在线免费视频| 亚洲入口无毒网址你懂的| 久久精品网站免费观看| 爱爱帝国亚洲一区二区三区| 四虎永久免费影院在线| jizz免费在线观看| 亚洲AV日韩AV永久无码免下载| 91精品国产免费久久国语蜜臀| 亚洲一级片在线观看| 在线免费观看毛片网站| 黄页免费视频播放在线播放| 国产亚洲成av人片在线观看| 最近2019中文字幕免费直播| 亚洲精品无码久久久久久| 中文字幕亚洲专区| 国产精品免费看久久久| 亚洲熟妇自偷自拍另欧美| 亚洲男人的天堂一区二区| 伊人久久免费视频| 最新亚洲春色Av无码专区| 亚洲精品黄色视频在线观看免费资源| 三上悠亚电影全集免费| 亚洲国产日韩在线成人蜜芽 | 好爽…又高潮了毛片免费看| 中文字幕免费观看视频| 亚洲国产日韩在线成人蜜芽 | 好湿好大好紧好爽免费视频|