前言
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]}`)
新闻热点
疑难解答
图片精选