函数在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 storage
myFunc.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 storage
myFunc.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 storage
myFunc.cache = {};

参考:

javascript中的memoization(memoizing) 技术介绍

JavaScript基础函数的属性:记忆模式(019)的更多相关文章

  1. JavaScript 基础六 'use strict'严格模式下的规则

    why 严格模式 [1] 消除js语法的一些不合理.不严谨.不安全问题,减少怪异行为并保证代码运行安全 [2] 提高编译器效率,增加运行速度 使用 [1]整个脚本启用严格模式,在顶部执行:" ...

  2. JavaScript基础函数---李老师的

    <!DOCTYPE html><html><head>    <title>demo2html</title>    <meta ch ...

  3. JavaScript基础函数的声明(014)

    1.函数的重要地位 函数(functions)在JavaScript里有着重要的地位,其原因有二: 它们是一种特殊的对象 它们提供作用域 说函数在JavaScript里是特殊的对象,因为: 程序的执行 ...

  4. Javascript基础 函数“重载”

    Javascript不像其他编程语言一样具有函数签名(什么是函数签名,简单的说就是说函数的接受参数类型和参数个数,也有人认为返回类型也应该包括.具体概念大家可以到网上查询). 所以Javascript ...

  5. JavaScript基础函数和词法分析以及常用的内置对象和使用方法(4)

    day52 参考:https://www.cnblogs.com/liwenzhou/p/8004649.html 函数 函数定义 JavaScript中的函数和Python中的非常类似,只是定义方式 ...

  6. javascript基础学习系列-原型链模式

    1.demo代码如下: 2.画图如下: 3.规则: 1)每一个函数数据类型(普通函数/类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值 2)并且prototy ...

  7. JavaScript -基础- 函数与对象

    一.JavaScript三对象 1.分类方式一 1)ECMAScript JavaScript的ECMA规范 JS本身的对象 2)Dom 操作HTML相关 3)BOM游览器对象 游览器窗口对象,全局的 ...

  8. JavaScript 基础知识之对比记忆学习

    1.  alter修改(易写混),alert警告 alert 函数语法:alert(str);str字符串用单引号或双引号隔开 2.标识符和关键字 标识符:由不以数字开头的字母.数字.下划线.$组成. ...

  9. JavaScript -基础- 函数与对象(二)String

    一.判断数据类型typeof与判断对象类型instanceof 1.typeof typeof只能判断基础数据类型,无法判断引用数据类型 <script> var s="hell ...

随机推荐

  1. Java实现 蓝桥杯 算法训练 Beaver's Calculator

    试题 算法训练 Beaver's Calculator 问题描述 从万能词典来的聪明的海狸已经使我们惊讶了一次.他开发了一种新的计算器,他将此命名为"Beaver's Calculator ...

  2. Java实现 蓝桥杯 历届试题 网络寻路

    问题描述 X 国的一个网络使用若干条线路连接若干个节点.节点间的通信是双向的.某重要数据包,为了安全起见,必须恰好被转发两次到达目的地.该包可能在任意一个节点产生,我们需要知道该网络中一共有多少种不同 ...

  3. Linux 工作管理

    把进程放入后台 进程后加&,这时,进程在后台是运行的 tar -zcf etc.tar.gz /etc & 在执行程序时,快速按下ctrl+z快捷键,这时,进程在后台是停止的 查看后台 ...

  4. C#基础篇——委托

    前言 在本章中,主要是借机这个C#基础篇的系列整理过去的学习笔记.归纳总结并更加理解透彻. 在.Net开发中,我们经常会遇到并使用过委托,如果能灵活的掌握并加以使用会使你在编程中游刃有余,然后对于很多 ...

  5. Php-webdriver 的安装与使用教程

    Php-webdriver 是 Facebook 开发的基于 PHP 语言实现的 Selenium WebDriver 客户端组件,可以用它来操作浏览器.常见的操作包括:自动化测试.采集数据等. 安装 ...

  6. Centos 7 k8s Deployment新副本控制器

    一.概念 Kubernetes提供了一种更加简单的更新RC和Pod的机制,叫做Deployment.通过在Deployment中描述你所期望的集群状态,Deployment Controller会将在 ...

  7. Javascript 随机显示数组元素

    $(function(){ var wx_arr = ['gb3055','gb6365']; var storage = window.localStorage; function random_w ...

  8. php 替换模板中的 PHP源码标签字符方法

    //替换php代码function RepPhpAspJspcode($string){ global $public_r; if(!$public_r[candocode]){ //$string= ...

  9. Stylus 之 网教通直播间整修

    暗色模式 效果 Mozilla 格式源代码 @-moz-document domain("fj.101.com") { * { transition: all .3s; } #wj ...

  10. TensorFlow从0到1之TensorFlow实现多元线性回归(16)

    在 TensorFlow 实现简单线性回归的基础上,可通过在权重和占位符的声明中稍作修改来对相同的数据进行多元线性回归. 在多元线性回归的情况下,由于每个特征具有不同的值范围,归一化变得至关重要.这里 ...