日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript id_好程序员web前端分享Javascript中函数作为对象

發布時間:2024/9/19 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript id_好程序员web前端分享Javascript中函数作为对象 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

好程序員web前端分享Javascript中函數作為對象,Javascript賦予了函數非常多的特性,其中最重要的特性之一就是將函數作為第一型的對象。那就意味著在javascript中函數可以有屬性,可以有方法, 可以享有所有對象所擁有的特性。

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

// 簡單實驗 函數作為對象的存在

let fn = function () {}

fn.prop = 'fnProp'

console.log(fn.prop) // fnProp

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

函數緩存

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

這樣不是不可以,但是顯然這種做法不是最好的。下面通過為函數屬性我們呢來實現這個我們的目的

// 1:函數緩存示例

let store = {

nextId: 1, // id

cache: {}, // 緩存

add (fn) {

// 如果函數中沒有id屬性那么就緩存

if (!fn.id) {

console.log(`begin add func ${fn.name}`)

fn.id = store.nextId ++

// 設置完緩存之后返回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對象用來管理我們的緩存,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 != 1

for (let index = 2; index < value; index++) {

if (value % index == 0) {

prime = false

break;

}

}

// 保存計算出來的值

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')) // HTMLCollection

console.log(getElements.cache['div']) // HTMLCollection

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

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

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

// 4:偽造數組方法

//

//

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]); //

console.log(elems[1]); //

console.log(elems.length); // 2

console.log(elems);

/**

0: input#add

1: input#remove

add: ? add(elem)

gather: ? gather(id)

length: 2

*/

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

總結

以上是生活随笔為你收集整理的JavaScript id_好程序员web前端分享Javascript中函数作为对象的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。