gpt4 book ai didi

javascript - Javascript 中的通用内存方法

转载 作者:行者123 更新时间:2023-11-27 23:20:59 24 4
gpt4 key购买 nike

我知道许多通用的内存方法依赖于对参数列表进行字符串化并将其用作键。例如。如:

Function.prototype.memoized = function() {
this._values = this.values || {};
var fn = this;
return function() {
var key = JSON.stringify( Array.prototype.slice.call(arguments) );
if (fn._values[key]===undefined) {
fn._values[key]=fn.apply(this, arguments);
}
return fn._values[key];
};
};

当尝试内存“成员函数”时,这显然会失败,因为还必须对上下文进行 JSON 字符串化,即将其视为隐式传递的参数。但是,当上下文是全局对象或同等深度的对象或以与函数本身无关的各种方式发生变化时,这种方法就不太有效。

但是,即使我们坚持使用非“成员函数”,也可能并不总是能够完成传递的参数列表的 strigify,对吗?

三个问题:

  1. 我是否正确理解以通用方式内存成员函数是没有意义的?
  2. 我是否正确理解,由于无法/不切实际地完全字符串化任何可能的参数列表,以通用方式内存非成员函数也是不可能的?
  3. 如果 2 成立,那么为什么这么多书籍和博客尝试在 Function.prototype 中定义通用的 memoize 函数?有什么意义?

最佳答案

方法是以 this 作为副作用来源的函数。您可能知 Prop 有副作用的函数无法被内存,因为这些影响不依赖于内存所依赖的方法的参数列表。

但是当然有一个解决方法。我们可以手动指定该方法所依赖的那些属性,而不是序列化整个对象(由 this 引用):

function memoize(f, deps) {
let cache = {};

return function(...args) {
let key = JSON.stringify([deps(), args]), v;
return cache[key] || (v = f.apply(this, args), cache[key] = v, v);
};
}

function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;

this.fullName = memoize(
function(title) { // memoized function
console.log('memoizing...');
return title + ' ' + this.firstName + ' ' + this.lastName;
},
function() { // dependencies
return [this.firstName, this.lastName];
}.bind(this));
}

let person = new Person('Jane', 'Doe');

// initial call
console.log(person.fullName('Ms.')); // memoizing...Ms. Jane Doe

// successive call
console.log(person.fullName('Ms.')); // Ms. Jane Doe

这只是一个概念验证,而不是经过全面优化和测试的解决方案。所有功劳都归于In Lehman's Terms

<小时/>

对于您的问题:

  1. 如果一个方法的计算成本非常昂贵,因此证明了这一努力的合理性,这需要手动定义其隐式依赖项(通过 this),那么不,它可能会很有用
  2. 是的,有时这是不可能的,但为什么要完全放弃几乎通用的解决方案?
  3. 不知道!旅鼠? :D

关于javascript - Javascript 中的通用内存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367151/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com