亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

了解Javascript中函數作為對象的魅力

2024-05-06 16:52:23
字體:
來源:轉載
供稿:網友

前言

Javascript賦予了函數非常多的特性,其中最重要的特性之一就是將函數作為第一型的對象。那就意味著在javascript中函數可以有屬性,可以有方法, 可以享有所有對象所擁有的特性。并且最重要的,她還可以直接被調用

我們簡單的試驗一下就可以發現

// 簡單實驗 函數作為對象的存在let fn = function () {}fn.prop = 'fnProp'console.log(fn.prop) // fnProp

為函數添加屬性的這個特性我覺的大家在平時的開發中基本沒什么嘗試或者是使用過,但是在一些JS庫或者是事件回掉管理中都能發揮出很大的用處。下面一起來看幾個例子。

函數緩存

在某有一些的情況下我們可以要存儲一組相關但是相互又獨立的函數。這個需求看起來很easy,實現起來也不復雜。最顯而易見的做法是使用一個數組來保存所有的函數,
這樣不是不可以,但是顯然這種做法不是最好的。下面通過為函數屬性我們呢來實現這個我們的目的

// 1:函數緩存示例let store = {nextId: 1, // idcache: {}, // 緩存add (fn) {// 如果函數中沒有id屬性那么就緩存if (!fn.id) {console.log(`begin add func ${fn.name}`)fn.id = store.nextId ++// 設置完緩存之后返回truereturn !!(store.cache[fn.id] = fn)} else {console.log(`${fn.name} is already in cache`)}}}function storeCache() {}store.add(storeCache) // begin add func storeCachestore.add(storeCache) // storeCache is already in cache

上面的這一段代碼邏輯清晰,store對象用來管理我們的緩存,cache屬性用來存儲函數,nextId屬性用來保存當前的緩存Id,add()方法用來設置存儲,先來判斷當前函數是否已經在緩存中然后再去設置緩存,這樣就能限制函數的重復添加,最后返回true。

!!構造是一種可以將任意Javascript表達式轉化為其等效布爾值的簡單方式。

緩存記憶函數

這種函數可以記住之前已經計算過的結果,避免了不必要的計算,這顯然是能夠提升代碼性能的。

在舉例之前我們先來看看這種方式的優缺點

優點

  • 緩存了之前的結果,最終用戶享有性能優勢
  • 實際上是發生在幕后,操作無感

缺點

  • 內存的犧牲這是肯定的
  • 打破了存粹性(一個函數或者方法應該只做好一件事)
  • 如果方法中有算法,那么很難測量這個算法的性能

了解了優缺點我們來看一個簡單的計算素數的例子(不是很嚴謹)

// 2: 緩存記憶函數function isPrime (value) {if (!isPrime.anwers) isPrime.anwers = {}// 先從緩存里面取if (isPrime.anwers[value] != null ) {return isPrime.anwers[value]}// 開始進行判斷和計算let prime = value != 1for (let index = 2; index < value; index++) {if (value % index == 0) {prime = falsebreak;} }// 保存計算出來的值return isPrime.anwers[value] = prime}console.log(isPrime(5))console.log(`從函數記憶中直接讀取${isPrime.anwers[5]}`)

這里呢 好處是特別明顯的我們再次的取用isPrime.anwers[5]的時候不需要經過任何的計算,但是大型的計算要主要內存的使用

緩存記憶DOM元素

通過元素的標簽查詢DOM的操作的的代價是昂貴的,各位前端大佬肯定都很清楚。我們下面使用緩存記憶的方式來進行這個操作

// 3:緩存記憶DOM元素function getElements (name) {if (!getElements.cache) getElements.cache = {}return getElements.cache[name] = getElements.cache[name] || document.getElementsByTagName(name);}console.log(getElements('div')) // HTMLCollectionconsole.log(getElements.cache['div']) // HTMLCollection

這個函數和上面的緩存使用的同一個手法,而且這簡單的4句代碼能為我們的性能帶來大幅度的提升。這也算是一種超能力吧。函數的很多特性都和其上下文有關,接下來我們研究一個和上下文又換的例子。

偽造數組方法(上下文相關)

在一些情況下我們想創建一個包含一組數據的對象,但是這個數據包含很多的狀態,比如和集合項有關的元數據那么我們用數組來存就不太合適了。那么這里我們就用對象的方式來假扮數組。通過改變上下文來完成一些“不法的行為”

// 4:偽造數組方法// <input type="button" id="add" >// <input type="button" id="remove" >let elems = {length: 0, //為了保存個數add (elem) {Array.prototype.push.call(this, elem)},gather (id) {this.add(document.getElementById(id))}}elems.gather('add')elems.gather('remove')console.log(elems[0]); // <input type="button" id="add" >console.log(elems[1]); // <input type="button" id="remove" >console.log(elems.length); // 2console.log(elems);/**0: input#add1: input#removeadd: ƒ add(elem)gather: ƒ gather(id)length: 2*/

在我還對JS懵懵懂懂的時候看到這樣的操作被秀了一臉,簡直是刺激了我幼小的心靈。

我們在add函數中實現了把元素添加到了集合中,而且Array又正好提供push方法, 不用白不用。這種操作也是直白的展示了函數上下文的超強特性。

總結

Javascript強大的靈活性, 也帶來更多的可能性。 路漫漫其修遠兮,吾將上下而求索。

代碼地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品国产2020观看福利| 69精品小视频| 国产精品福利网| 日本精品一区二区三区在线播放视频| 青青草原一区二区| 亚洲护士老师的毛茸茸最新章节| 欧美黄色www| 国产区亚洲区欧美区| 国产精品7m视频| 欧美成人免费全部| 国产精品69久久| 欧美精品日韩www.p站| 久久亚洲一区二区三区四区五区高| 国产精品视频1区| 日韩欧美亚洲成人| 久久久久久久久久久久av| 国产一区二区三区在线免费观看| 欧美日韩国产一中文字不卡| 日韩美女视频在线观看| 亚洲色图欧美制服丝袜另类第一页| 91亚洲国产精品| 色在人av网站天堂精品| 日韩av影视综合网| 久久国产精品久久久久久久久久| 亚洲国产精品久久久久| 97人人爽人人喊人人模波多| 一本一本久久a久久精品牛牛影视| 精品久久中文字幕久久av| 国产精品久久9| 福利微拍一区二区| 国产剧情日韩欧美| 国产精品国产三级国产aⅴ浪潮| 久久久亚洲国产天美传媒修理工| 亚洲人成电影在线观看天堂色| 亚洲欧美日韩精品久久亚洲区| 久久久久久亚洲精品中文字幕| 国产精品亚洲一区二区三区| 另类视频在线观看| 国产专区欧美专区| 亚洲第一页在线| 精品国产依人香蕉在线精品| 色综合久综合久久综合久鬼88| 国内精品久久久久久久久| 97超级碰在线看视频免费在线看| 久久精品色欧美aⅴ一区二区| 亚洲一区二区三区777| 国产精品你懂得| 国内精品久久久久久久久| 色哟哟网站入口亚洲精品| 久久亚洲电影天堂| 丝袜情趣国产精品| 中文字幕日韩视频| 亚洲男人7777| 91在线色戒在线| 欧美激情国内偷拍| 国产91在线播放精品91| 欧美激情精品久久久久久久变态| xxx成人少妇69| 欧美专区日韩视频| 中文字幕久热精品视频在线| 国产日韩精品入口| 国产精品日韩专区| 精品少妇v888av| 日韩网站免费观看| 久久久999精品视频| 精品亚洲一区二区三区在线播放| 久热精品视频在线| 欧美成人精品影院| 日韩最新av在线| 91精品久久久久久久久久久久久久| 欧美成人自拍视频| 精品久久久中文| 亚洲片国产一区一级在线观看| 亚洲精品一区中文字幕乱码| 久久精品国产96久久久香蕉| 欧洲成人在线观看| 中文字幕亚洲色图| 欧美日韩国产综合视频在线观看中文| 国产精品久久久久久久久久久久久| 成人免费视频在线观看超级碰| 国内成人精品视频| 九九热这里只有在线精品视| 伊人久久大香线蕉av一区二区| 久久久久久亚洲精品| 亚洲一区二区三区乱码aⅴ| 国产精品欧美一区二区| 国产一区二区三区欧美| 一本一本久久a久久精品综合小说| 日韩在线中文视频| 欧美日韩国产第一页| 国产偷国产偷亚洲清高网站| 日韩电视剧免费观看网站| 欧美黄网免费在线观看| 亚洲伊人成综合成人网| 日韩动漫免费观看电视剧高清| 亚洲欧洲日产国产网站| 久久免费成人精品视频| 亚洲iv一区二区三区| 国产在线观看精品一区二区三区| 亚洲精品一区二区三区不| 日韩电影免费观看在线| 欧美一级黄色网| 国产精品观看在线亚洲人成网| 精品国产区一区二区三区在线观看| 国产精品久久久av| 欧美激情a∨在线视频播放| 国产精品视频资源| 欧美日韩国产一区二区三区| 久久久精品2019中文字幕神马| 亚洲欧美日韩精品久久亚洲区| 亚洲网址你懂得| 久久亚洲精品国产亚洲老地址| 久久精品国产2020观看福利| 日韩美女激情视频| 日韩最新在线视频| 日韩二区三区在线| 亚洲福利视频网站| 性欧美在线看片a免费观看| 亚洲国产精品久久久| 夜夜嗨av一区二区三区四区| 国产精品久久久久久久美男| 国产精品吹潮在线观看| 国产精品美女久久久久久免费| 中文字幕日韩欧美在线视频| 久久久噜噜噜久久久| 成人午夜在线影院| 深夜福利91大全| 午夜剧场成人观在线视频免费观看| 亚洲一二在线观看| 国产精品日韩av| 亚洲国产成人久久综合一区| 伊人久久综合97精品| 亚洲最大的av网站| 麻豆成人在线看| 日韩一区二区三区在线播放| 在线国产精品播放| 欧美精品久久一区二区| 亚洲成人亚洲激情| 亚洲综合成人婷婷小说| 一本大道香蕉久在线播放29| 欧美乱妇40p| 一区二区欧美久久| 亚洲成年人影院在线| 久久久久久久久久久久久久久久久久av| 中文字幕最新精品| 欧美性猛交xxxx免费看| 亚洲欧美中文字幕| 91亚洲精品一区二区| 5566成人精品视频免费| 亚洲第一av在线| 国产日韩欧美在线视频观看| 国产精品成熟老女人| 成人精品一区二区三区| 国产主播精品在线| 成人免费看黄网站| 久久天天躁狠狠躁夜夜躁2014| 777国产偷窥盗摄精品视频| 欧美二区乱c黑人| 91人人爽人人爽人人精88v| 日韩av影视在线| 国产精品美乳在线观看| 成人妇女淫片aaaa视频| 中文日韩在线视频| 97视频色精品|