博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript基础函数的属性:记忆模式(019)
阅读量:6352 次
发布时间:2019-06-22

本文共 1428 字,大约阅读时间需要 4 分钟。

函数在Javascript里是有属性的,因为它们是一种特殊对象。事实上,就算是没有明确声明,函数在最初就已经包含了一些固有的属性,比如所有函数都length这个属性,它可以指出函数声明了多少个参数:

function func(a, b, c) {}console.log(func.length); // 3
 
你 可以随时使用函数的属性。其中一个函数属性的用法是,把函数的返回值保存起来,方便下次执行时再使用,这就是函数的记忆模式。比如,下面的函数myFun 就声明了一个叫cache的属性,可以通过myFun.cache来访问,而cache又是一个对象,通过保存相应的键值对,保存myFun的执行结果:
var myFunc = function (param) {    if (!myFunc.cache[param]) {        var result = {};        // ... expensive operation ...        myFunc.cache[param] = result;    }    return myFunc.cache[param];};// cache storagemyFunc.cache = {};

 

上面的例子可以适用于函数使用一个参数的情况,如果函数接受多个参数,则可以先把这些参数变成JSON字符串,再把这个字符串作为Key来保存程序的执行结果:
var myFunc = function () {    var cachekey = JSON.stringify(Array.prototype.slice.call(arguments)),        result;    if (!myFunc.cache[cachekey]) {        result = {};        // ... expensive operation ...        myFunc.cache[cachekey] = result;    }    return myFunc.cache[cachekey];};// cache storagemyFunc.cache = {};

 

这种做法有的缺点是,把参数变成JSON字符串后,它有对象“标识”就丢失了,这样,如果有两次执行过程中的参数是不同的对象,但它们的属性相同,那么只会为它们保存一个执行结果。
另一种
完成相同功能的实现采用了arguments.callee,这种写法比较通用,不用把每个函数名都写出来。但ECMAScript 5 标准中并不支持arguments.callee。
var myFunc = function (param) {    var f = arguments.callee,        result;    if (!f.cache[param]) {        result = {};        // ... expensive operation ...        f.cache[param] = result;    }    return f.cache[param];};// cache storagemyFunc.cache = {};

 

参考:

转载于:https://www.cnblogs.com/Bryran/p/3976125.html

你可能感兴趣的文章
操作linux命令
查看>>
转载]typedef struct和struct的区别
查看>>
数据仓库、数据整合、ETL、ELT和EII之间的区别?
查看>>
c++ 注册表操作dll动态调用
查看>>
C#开发人员应该知道的13件事情
查看>>
工厂模式(Factory)
查看>>
Linux 虚拟地址与物理地址的映射关系分析【转】
查看>>
GNU make manual 翻译(三十七)
查看>>
自动化测试框架的搭建
查看>>
Linux 邮件服务器 之跟我一步一步来实现一个邮件系统【转】
查看>>
SpringAop
查看>>
[RHEL5企业级Linux服务攻略]--第4季 DNS服务全攻略
查看>>
jetty简单学习
查看>>
Centos 6.5使用yum安装mysql
查看>>
Activiti-5.9工作流引擎-数据库表结构
查看>>
HTTP请求状态码
查看>>
Tomcat修改jvm内存(Linux)
查看>>
Eclipse jQuery plug-in(自动补全)
查看>>
基于HTML5 Canvas 点击添加 2D 3D 机柜模型
查看>>
neovim 计划
查看>>