亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

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

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

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

函數(shù)緩存

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

// 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 ++
// 設置完緩存之后返回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屬性用來存儲函數(shù),nextId屬性用來保存當前的緩存Id,add()方法用來設置存儲,先來判斷當前函數(shù)是否已經(jīng)在緩存中然后再去設置緩存,這樣就能限制函數(shù)的重復添加,最后返回true。

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

緩存記憶函數(shù)

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

在舉例之前我們先來看看這種方式的優(yōu)缺點

優(yōu)點

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

缺點

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

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

// 2: 緩存記憶函數(shù)
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(`從函數(shù)記憶中直接讀取${isPrime.anwers[5]}`)

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

緩存記憶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

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

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

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

// 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
*/

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

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

總結

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

代碼地址

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 微信小程序實現(xiàn)傳參數(shù)的幾種方法示例

    微信小程序實現(xiàn)傳參數(shù)的幾種方法示例

    這篇文章主要給大家介紹了關于微信小程序實現(xiàn)傳參數(shù)的幾種方法,分別是navigator跳轉時、全局變量、列表index下標取值以及form表單傳值的相關內(nèi)容,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2018-01-01
  • 自定義的一個簡單時尚js下拉選擇框

    自定義的一個簡單時尚js下拉選擇框

    下拉選擇框,是我們在網(wǎng)頁中經(jīng)常使用到的,在本文為大家詳細介紹下使用js使用的下拉選擇框
    2013-11-11
  • js函數(shù)排序的實例代碼

    js函數(shù)排序的實例代碼

    這篇文章介紹了js函數(shù)排序的代碼,有需要的朋友可以參考一下
    2013-07-07
  • javascript元素動態(tài)創(chuàng)建實現(xiàn)方法

    javascript元素動態(tài)創(chuàng)建實現(xiàn)方法

    這篇文章主要介紹了javascript元素動態(tài)創(chuàng)建實現(xiàn)方法,涉及javascript操作元素的相關技巧,需要的朋友可以參考下
    2015-05-05
  • js cavans實現(xiàn)靜態(tài)滾動彈幕

    js cavans實現(xiàn)靜態(tài)滾動彈幕

    這篇文章主要為大家詳細介紹了js cavans實現(xiàn)靜態(tài)滾動彈幕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • JavaScript仿淘寶放大鏡效果

    JavaScript仿淘寶放大鏡效果

    這篇文章主要為大家詳細介紹了JavaScript仿淘寶放大鏡效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 前端圖片壓縮常見的一些解決辦法

    前端圖片壓縮常見的一些解決辦法

    這篇文章主要給大家介紹了關于前端圖片壓縮常見的一些解決辦法,圖片上傳是前端中常見的的業(yè)務場景,無論是前臺還是后臺,適當?shù)膶D片進行壓縮處理,可以顯著的提升用戶體驗,需要的朋友可以參考下
    2023-11-11
  • javascript實時顯示北京時間的方法

    javascript實時顯示北京時間的方法

    這篇文章主要介紹了javascript實時顯示北京時間的方法,涉及javascript操作時間顯示的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-03-03
  • 學習JavaScript設計模式(繼承)

    學習JavaScript設計模式(繼承)

    這篇文章主要帶領大家學習JavaScript設計模式,其中重點介紹繼承,舉例說明為什么需要繼承,對繼承進行詳細剖析,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 一文帶你理解微信小程序中RPC通信的實現(xiàn)

    一文帶你理解微信小程序中RPC通信的實現(xiàn)

    在微信小程序開發(fā)中,要實現(xiàn)兩個線程之間的通信是一項重要的任務,所以本文就來講講如何使用小程序的?postMessage?和?addListener?API?來實現(xiàn)在兩個線程之間進行高效的?RPC?通信吧
    2023-06-06

最新評論