阅读更多

14顶
0踩

Web前端

原创新闻 一个优秀的Javascript Memoizer

2009-05-07 11:26 by 副主编 zly06 评论(10) 有5894人浏览

John Hann提供了一个很不错的Memoizer实现 - memoization,充分利用了closures,arity 和 recursion-JavaScript最重要的3个概念/功能。

// memoize: a general-purpose function to enable a function to use memoization
//   func: the function to be memoized
//   context: the context for the memoized function to execute within
//   Note: the function must use explicit, string-serializable parameters
function memoize (func, context) {
    function memoizeArg (argPos) {
        var cache = {};
        return function () {
            if (argPos == 0) {
                if (!(arguments[argPos] in cache)) {
                   cache[arguments[argPos]] = func.apply(context, arguments);
                }
                return cache[arguments[argPos]];
            }
            else {
                if (!(arguments[argPos] in cache)) {
                    cache[arguments[argPos]] = memoizeArg(argPos - 1);
                }
                return cache[arguments[argPos]].apply(this, arguments);
           }
        }
    }
    // JScript doesn't grok the arity property, but uses length instead
    var arity = func.arity || func.length;
    return memoizeArg(arity - 1);
}


Hann说道:memoization的概念很简洁。为什么要使用它,而不是仅仅用hand-coded缓存机制?很简单,因为它能能使这个工作变的容易。举例来说:

  • hand-coded缓存机制会混淆你的代码
  • 在JavaScript中,multi-variate缓存机制很笨重
  • 较少的代码以为着更少的错误


点击查看详情:http://unscriptable.com/index.php/2009/05/01/a-better-javascript-memoizer/

 

来自: ajaxian
14
0
评论 共 10 条 请登录后发表评论
10 楼 Bernard 2009-05-08 14:43
Memoizer让我想起一个单词:Womanizer
9 楼 pangyi 2009-05-08 12:25
琢磨下怎么用。
8 楼 zlt2000 2009-05-08 09:52
看不懂?是用来做什么的,这样用
7 楼 javaeyebird 2009-05-08 08:39
javaeyebird 写道

没用,被flashblock禁止了,应该把嵌入的flash显示出来

晕,发错了...
6 楼 javaeyebird 2009-05-08 08:38
没用,被flashblock禁止了,应该把嵌入的flash显示出来
5 楼 鹤惊昆仑 2009-05-08 08:36
这个很简单,一句话概括就是:缓存函数的执行结果,避免重复计算。
4 楼 whaosoft 2009-05-08 07:40
还是的 来个例子看看吧
3 楼 achun 2009-05-08 05:50
好东西,适用于数值算法,不过对于常见的 DOM 元素无效。因为当函数的参数是一个element时。
cache[arguments[argPos]] 中的arguments[argPos]被转成字符串了,而所有的DIV将都变成字符串
object HTMLDivElement。
2 楼 ShiningRay 2009-05-07 13:29
我一直想不通的是memoize没这个单词啊
1 楼 xiexueze 2009-05-07 12:08
能弄个例子,说明下这东东怎么用吗?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 启动控制面板的源代码资源

    启动控制面板 启动控制面板 启动控制面板 启动控制面板 启动控制面板

  • 怎样开发控制面板程序(CPL程序)

    怎样开发控制面板程序(CPL程序)    CPL程序是动态链接库(DLL)的一种变形,只不过扩展名为.cpl、入口函数为CPlApplet()而不是DllMain()罢了,编写起来其实很简单。先创建一个dll工程,写下如下代码#include #include #include extern "C" __declspec(dllexport) long __stdcall CPlApplet(H

  • windows10 ,再控制面板--卸载程序,具体是 执行的 哪一个文件 ,怎么 查找

    在Windows 10中,当你通过控制面板中的“卸载程序”功能卸载程序时,实际上是执行了该程序的卸载程序。每个程序通常会有一个专门的卸载程序或脚本,它是在软件安装时一并安装的。请注意,直接修改注册表可能会对系统造成不可预见的影响,所以在进行任何更改之前,确保你了解自己正在做什么,并且最好先备份相关的注册表项。如果你不熟悉注册表操作,建议寻求专业人士的帮助。2. 再注册表中,找 该 应用名称相近,或者,上述文件路径 相近的 文件夹里面;1. 任务管理器中, 右击 该进程, “打开该文件所在的位置”;

  • Windows控制面板编程

    控制面板,控制面板应用程序,   一、             什么是控制面板 打开Windows的控制面板会看到类似的图像 图一 双击其中的一个图标,会显示对话框,让用户来完成相应的软硬件设置工作。这就是我们看到的控制面板。那么如何开发控制面板程序呢?带着疑问在MSDN和google里搜索关键字“Control Panel”,就会找到相关的技术文章。这是我工作的方法:借鉴已有的

  • c语言extern int的作用,extern “C” 是什么含义,有什么作用

    (1) 被extern限定的函数或变量是extern类型的:a.extern修饰变量的声明。举例来说,如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externintv,然后就可以引用变量v。这里需要注意的是,被引用的变量v的链接属性必须是外链接(external)的,也就是说a.c要引用到v,不只是取决于在a.c中声明externintv,还取决于变量v本身是能够被引用到的。...

  • 控制板开发的分类

    控制板是设备的主要控制中心,整个设备需要做什么都要控制板给出一个详细的操作信息,这就好比人的大脑,可以指导我们的肢体做一些事情一样。一台设备的好坏,取决于控制板设计是否合理,为了开拓市场,企业加大对产品的研发力度,其中最主要的就是进行控制板开发。 控制板开发主要分为以下几大类: 1、工业控制板:又叫电源控制板,可分为中频电源控制板和高频电源控制板两种。常见工业设备控制板有:数控雕刻机控制板、贴标机控制板、自动钻孔机控制板和超声波清洗机控制板等; 2、家电控制板:家电控制板已经融入了物联网技术,普遍应用于我们

  • VC++动态链接库(DLL)编程深入浅出(四)

    MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用MFC本身的DLL一样。除了可以在MFC扩展DLL的内部使用MFC以外,MFC扩展DLL与应用程序的接口部分也可以是MFC。我们一般使用MFC扩展DLL来包含一些MFC的增强功能,譬如扩展MFC的CStatic、CButton等类使之具备更强大的能力。   使用Visual C++向导生产MFC扩展DLL时,MFC向导会自动

  • 怎么隐藏计算机控制面板程序,“控制面板”的另类隐藏

    笔者是一名微机教师,最让我头疼的就是上课时,那帮“调皮鬼”乱改“控制面板”,弄出一堆莫名其妙的故障让我收拾残局。而常用的方法无非是通过修改注册表或用《优化大师》、《超级兔子》等软件把“控制面板”隐藏起来。但这样做也有弊端,就是自己用的时候改来改去的很不方便。怎么办?通过一段时间的摸索,笔者找到了一种《超级兔子》+Word文档的解决方法,在此与大家分享。第一步:打开“控制面板”,选中所有的项目,然后...

  • 怎样快速进win10控制面板中--程序与功能等

    win+R打开cmd 输入control即可弹出控制面板 再进入“程序与功能”即可

  • UNREFERENCED_PARAMETER,函数定义中没有使用函数入口的参数列表中的参数

    有些时候定义了一个函数之后,函数的参数列表中的参数不一定会被调用,例如一般的main函数中就有参数不一定会被使用,还有就是回调函数,当初接口已经定义好了,现在自己写的函数只想使用其中某个参数,这个时候就会造成某些参数不被使用,如果编译的时候使用高级别的警告级别,那么就会发出警告,一般低级别的警告不会检查函数入口的参数列表中的函数是否都被使用,想要在高级别的警告级别下避免类似警告可以使用UNREFE

  • Delphi 开发控制面板程序

    一、关于控制面板程序 在Windows中提供了一个控制面板窗口,一个控制面板窗口就象Windows的控制中心。在窗口中有诸如 “系统”、“多媒体”图标,通过双击这些不同的图标,就可以打开不同的控制面板程序查看系统状况和对系统进行设置了。   如何在控制面板中添加自己的控制面板程序呢?首先来了解以下控制面板程序的原理。一个控制面板程序就是一个动态连接库(DLL)。在库文件中必须建立一个名称为

  • 控制台编程相关API 及相关编程

    1. 编写控制台程序,获得标准输入输出的窗口句柄

  • extern C的作用详解

         extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。      这个功能十分有用处,因为在C++出现以前,很多代码都是C语言写的,而且很底层的库也是C语言写的,为了更好的支持原来的C代

  • c语言extern int的作用,c语言之extern

    c语言有三种链接,外部链接,内部链接和无链接。外部链接:对构成程序的所有文件可用,如函数和全局变量具有外部链接。内部链接:仅在声明他们的文件中是已知的。如声明为static的文件域具有内部链接。无连接:仅在自己的块中已知,其它地方没有办法访问,如局部变量。extern主要作用是:声明在程序的其它地方使用外部链接声明的对象。声明:表述对象的名称和类型。定义:为对象分配存储空间。例如:int main...

  • python控制程序_如何用Python写控制程序

    Python 是一种胶水语言,可以非常方便的粘合各种模块,比如C++,C等。由于项目需要,我需要使用Qt设计界面,以Python脚本来控制一个二维的位移平台的移动。其中位移控制卡提供了一个DLL文件,用于平台控制。下面是我的步骤:1,在Qt中设计UI。打开Qt Designer ,新建一个Form 这样你就可以开始设计你的程序UI界面了。设计完成后保存为xxx.ui。记得将控件的名称修改自己熟...

  • 让程序出现在控制面板

        1、主要是写注册表,在HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall这个下面建立一个键值,一般都是一个唯的GUID     2、然后在GUID键值下面,创建许多子键值。   示例代码:     假设m_strInstallPath="C:\\Program files\\App"...

  • 怎么隐藏计算机控制面板程序,如何将win7电脑控制面板中的添加删除程序操作隐藏起来?...

    一般来说,只要不是系统自带的程序和软件,只要不是系统本身的东西,咱们若是要删除它们的话,都需要通过控制面板中的添加删除程序操作来执行,想必之前很多朋友已经使用过这个功能了吧?咱们也不在这里介绍太多了,但是因为有这个功能的存在,也导致了很多不是很懂得操作的朋友误删除了一些文件,这便是今天想要为大家介绍的具体操作方式,如何将win7电脑中的添加删除程序操作隐藏起来?相关推荐:U盘启动盘第一种方法:咱们...

  • 自动化测试——自动卸载软件

    在平常的测试工作中,经常要安装软件,卸载软件, 即繁琐又累。 安装和卸载完全可以做成自动化。 安装软件我们可以通过自动化框架,自动点击Next,来自动安装。 卸载软件我们可以通过msiexec命令行工具自动化卸载软件

Global site tag (gtag.js) - Google Analytics