最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

了解Javascript中函數(shù)作為對(duì)象的魅力

 更新時(shí)間:2019年06月19日 08:32:01   作者:MARKORMARK  
這篇文章主要介紹了了解Javascript中函數(shù)作為對(duì)象的魅力,javascript中函數(shù)可以有屬性,可以有方法, 可以享有所有對(duì)象所擁有的特性。并且最重要的,她還可以直接被調(diào)用,需要的朋友可以參考下

前言

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

我們簡(jiǎn)單的試驗(yàn)一下就可以發(fā)現(xiàn)

// 簡(jiǎn)單實(shí)驗(yàn) 函數(shù)作為對(duì)象的存在
let fn = function () {}
fn.prop = 'fnProp'
console.log(fn.prop) // fnProp

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

函數(shù)緩存

在某有一些的情況下我們可以要存儲(chǔ)一組相關(guān)但是相互又獨(dú)立的函數(shù)。這個(gè)需求看起來(lái)很easy,實(shí)現(xiàn)起來(lái)也不復(fù)雜。最顯而易見的做法是使用一個(gè)數(shù)組來(lái)保存所有的函數(shù),
這樣不是不可以,但是顯然這種做法不是最好的。下面通過為函數(shù)屬性我們呢來(lái)實(shí)現(xiàn)這個(gè)我們的目的

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

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

!!構(gòu)造是一種可以將任意Javascript表達(dá)式轉(zhuǎn)化為其等效布爾值的簡(jiǎn)單方式。

緩存記憶函數(shù)

這種函數(shù)可以記住之前已經(jīng)計(jì)算過的結(jié)果,避免了不必要的計(jì)算,這顯然是能夠提升代碼性能的。

在舉例之前我們先來(lái)看看這種方式的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 緩存了之前的結(jié)果,最終用戶享有性能優(yōu)勢(shì)
  • 實(shí)際上是發(fā)生在幕后,操作無(wú)感

缺點(diǎn)

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

了解了優(yōu)缺點(diǎn)我們來(lái)看一個(gè)簡(jiǎn)單的計(jì)算素?cái)?shù)的例子(不是很嚴(yán)謹(jǐn))

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

這里呢 好處是特別明顯的我們?cè)俅蔚娜∮胕sPrime.anwers[5]的時(shí)候不需要經(jīng)過任何的計(jì)算,但是大型的計(jì)算要主要內(nèi)存的使用

緩存記憶DOM元素

通過元素的標(biāo)簽查詢DOM的操作的的代價(jià)是昂貴的,各位前端大佬肯定都很清楚。我們下面使用緩存記憶的方式來(lái)進(jìn)行這個(gè)操作

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

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

偽造數(shù)組方法(上下文相關(guān))

在一些情況下我們想創(chuàng)建一個(gè)包含一組數(shù)據(jù)的對(duì)象,但是這個(gè)數(shù)據(jù)包含很多的狀態(tài),比如和集合項(xiàng)有關(guān)的元數(shù)據(jù)那么我們用數(shù)組來(lái)存就不太合適了。那么這里我們就用對(duì)象的方式來(lái)假扮數(shù)組。通過改變上下文來(lái)完成一些“不法的行為”

// 4:偽造數(shù)組方法
// <input type="button" id="add" >
// <input type="button" id="remove" >
let elems = {
length: 0, //為了保存?zhèn)€數(shù)
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); // 2
console.log(elems);
/**
0: input#add
1: input#remove
add: ƒ add(elem)
gather: ƒ gather(id)
length: 2
*/

在我還對(duì)JS懵懵懂懂的時(shí)候看到這樣的操作被秀了一臉,簡(jiǎn)直是刺激了我幼小的心靈。

我們?cè)赼dd函數(shù)中實(shí)現(xiàn)了把元素添加到了集合中,而且Array又正好提供push方法, 不用白不用。這種操作也是直白的展示了函數(shù)上下文的超強(qiáng)特性。

總結(jié)

Javascript強(qiáng)大的靈活性, 也帶來(lái)更多的可能性。 路漫漫其修遠(yuǎn)兮,吾將上下而求索。

代碼地址

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 函數(shù)式編程入門實(shí)踐(一)

    函數(shù)式編程入門實(shí)踐(一)

    這篇文章主要介紹了Javascript函數(shù)式編程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • JS動(dòng)態(tài)獲取元素寬高的幾種方式

    JS動(dòng)態(tài)獲取元素寬高的幾種方式

    這篇文章主要介紹了js 動(dòng)態(tài)獲取元素寬高的幾種方式,文章通過代碼示例和圖文結(jié)合的方式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-09-09
  • 對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解

    對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解

    今天小編就為大家分享一篇對(duì)layui數(shù)據(jù)表格動(dòng)態(tài)cols(字段)動(dòng)態(tài)變化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2019-10-10
  • 一文帶你掌握axios 工具函數(shù)

    一文帶你掌握axios 工具函數(shù)

    這篇文章主要為大家介紹了axios 工具函數(shù)使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • 詳解如何在JS代碼中消滅for循環(huán)

    詳解如何在JS代碼中消滅for循環(huán)

    這篇文章主要介紹了詳解如何在JS代碼中消滅for循環(huán),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • JavaScript基于ajax編輯信息用法實(shí)例

    JavaScript基于ajax編輯信息用法實(shí)例

    這篇文章主要介紹了JavaScript基于ajax編輯信息用法,涉及javascript基于Ajax操作鼠標(biāo)事件及實(shí)時(shí)保存文本的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • ES6中的類(Class)示例詳解

    ES6中的類(Class)示例詳解

    這篇文章主要給大家介紹了關(guān)于ES6中類(Class)的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 微信小程序中如何實(shí)現(xiàn)動(dòng)態(tài)改變SVG顏色和尺寸

    微信小程序中如何實(shí)現(xiàn)動(dòng)態(tài)改變SVG顏色和尺寸

    SVG可被非常多的工具讀取和修改SVG與JPEG和GIF圖像比起來(lái),尺寸更小,且可壓縮性更強(qiáng),下面這篇文章主要給大家介紹了關(guān)于微信小程序中如何實(shí)現(xiàn)動(dòng)態(tài)改變SVG顏色和尺寸的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • js仿微信語(yǔ)音播放實(shí)現(xiàn)思路

    js仿微信語(yǔ)音播放實(shí)現(xiàn)思路

    這篇文章主要為大家詳細(xì)介紹了js仿微信語(yǔ)音播放的實(shí)現(xiàn)思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換

    TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換

    樹或者圖是個(gè)比較抽象的概念,并不存在這樣的數(shù)據(jù)類型。數(shù)組就比較簡(jiǎn)單了,因此數(shù)組和樹的轉(zhuǎn)換可以理解為數(shù)組和對(duì)象之間的轉(zhuǎn)換。本文將用TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換,感興趣的可以了解一下
    2022-06-06

最新評(píng)論

海丰县| 梓潼县| 塔河县| 林口县| 山东| 塔河县| 连城县| 磐安县| 白水县| 黔西| 会昌县| 章丘市| 望都县| 灵璧县| 利津县| 大安市| 精河县| 香港 | 民和| 文安县| 河北区| 双辽市| 邯郸县| 屯留县| 乌拉特中旗| 大邑县| 徐闻县| 德兴市| 汉阴县| 射洪县| 读书| 德化县| 两当县| 百色市| 宁安市| 大理市| 麻城市| 临沧市| 新余市| 临邑县| 邮箱|