我感兴趣的是我们有一些函数f的场景,它是递归的,我们没有提供源代码.
我想要一个函数memoizer:Function - > Function,它接受说f并返回一个函数g,使得g = f(在某种意义上它们返回给定相同参数的相同值),当调用时首先检查被调用的参数是否为在它的'缓存'(它之前已经计算过的结果的内存)中,如果这样返回结果,否则它应该计算f,如果f用一些参数调用自己,这无异于用这些参数调用g,我想首先检查g的缓存是否包含这些参数,如果是,则返回结果,否则......
这很容易(在Javascript中)给出f的源代码,我只是以明显的方式定义memoize并做类似的事情
let f = memoize((...args) => {/* source code of f */});
Run Code Online (Sandbox Code Playgroud)
但这根本不吸引我(主要是因为我可能想要一个相同功能的memoized和非memoized版本然后我必须写两次相同的功能)如果我不知道将无法工作如何实施f.
如果我不清楚我在问什么,
我想要一个函数memoize,它具有如下函数
fact = n => n === 0 ? 1 : n * fact(n - 1);
Run Code Online (Sandbox Code Playgroud)
并且返回一些新函数g,使得所有n的fact(n)= g(n)并且例如当计算g(10)时存储fact(0),...,fact(10)的值,这是计算g(10)时计算,然后如果我要求说g(7)它在缓存中找到结果并将其返回给我.
我认为概念上可以检测f何时被调用,因为我有它的地址,也许我可以用一个新函数替换所有对f的调用,我计算f并存储结果,然后将值传递到它所在的位置通常去.但我不知道该怎么做(这听起来很不愉快).
我有一个 chrome 应用程序,我想在分辨率更改时正确调整大小(尺寸与屏幕宽度成正比)。我已经编写了一个函数,可以使用正确的尺寸重新绘制应用程序,现在我只想在需要时执行它。
分辨率更改会导致 screen.width 更改,但是(可能并不奇怪,因为它们与不同的事物有关)不会触发“调整大小”事件,据我所知,没有触发任何事件。
我知道 Proxy 对象(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy)所以我写了一些代码来检测何时设置了变量并执行我的回调,这似乎有效,但在分辨率更改的情况下无效。
所以我在网上搜索并尝试了这个https://gist.github.com/eligrey/384583(这基本上是关于类似主题的几个 stackoverflow 问题中提供的答案,确实是我最初制作的,尽管缺乏新的抽象代理对象提供)。
这似乎也有效(在某种意义上,如果我说在完成 screen.watch("width", () => console.log("hello")); 然后做 screen.width = 100 ; 我的回调被执行)。但不是在分辨率改变的情况下(事实上,也许最重要的是,分配这个观察者似乎阻止了 screen.width 被分配)。
我有三个问题
1)当我分配一个把事情搞砸的观察者/代理时发生了什么。
2)我怎么能找出浏览器在这个细节级别上做什么(什么发送触发器来改变 screen.width?我猜是操作系统,它看起来像什么)
3) 有没有更好的方法来实现我最初的目标(chrome 应用程序调整大小)。
大多数情况下,我对问题 1) 感兴趣,不再关心 3)。
要复制我的问题,
编辑 - 正如 Bertrand …