缓存John Resig';s学习高级JavaScript
关于这个函数,我有几个问题来自John Resig的练习#19缓存John Resig';s学习高级JavaScript,javascript,Javascript,关于这个函数,我有几个问题来自John Resig的练习#19 最后第二行getElements.cache={}的用途是什么是否将返回结果存储在数组中 如果我在(1)中的猜测是正确的,它是否只捕获返回结果,因为在函数的“else”部分,getElements.cache[name]=results 在本教程中,当我在控制台中玩代码时,我从“else”部分删除了行getElements.cache[name]=results,但仍然得到了与当时相同的结果,即它告诉我有76个元素。因此,如果不需要
getElements.cache={}的用途是什么
是否将返回结果
存储在数组中返回结果
,因为在函数的“else”部分,getElements.cache[name]=results代码>
getElements.cache[name]=results
,但仍然得到了与当时相同的结果,即它告诉我有76个元素。因此,如果不需要获取结果,那么此行的目的是什么getElements.cache[name]=results的顺序是否有意义代码>与代码的if
部分相反,该部分表示results=getElements.cache[name]
cache
是JavaScript中的预定义函数吗?我在文档中找不到它getElements.cache={}代码>是吗
在数组中存储返回结果
它只是初始化对象
2.-如果我在(1)中的猜测是正确的,是吗
只捕捉返回结果是因为,
在函数的“else”部分,
getElements.cache[name]=结果代码>
是的,它使用缓存方法来避免访问DOM
-当我在游戏中玩代码时
在教程中,我删除了
linegetElements.cache[name]=结果
从“其他”部分,但仍然得到
同样的结果,就像当它
那里,也就是说,它告诉我
共有76个元素。因此,这是什么
这条路线的目的是什么
getElements.cache[name]=结果
if
没有必要得到结果吗
从某种意义上说,它只是使函数返回得更快,这并不是真正必要的,因为访问对象比遍历DOM要快
4.-这件事有什么意义吗
那,在
函数,该行的顺序
getElements.cache[name]=结果代码>是
从中的if部分反转
代码,其中显示results=getElements.cache[name]
在else部分中,首先为results
变量分配一个实际结果值,然后缓存结果。在then部分中,results
变量只是被分配了缓存的值。不需要重新缓存它
5.-最后,缓存是预定义的吗
JavaScript中的函数?我找不到
它在文档中显示
它不是预定义的。它被用作这个特定函数的属性(在JavaScript中,函数是第一类对象,可以在属性中存储值)
以下是注释的代码:
function getElements( name ) {
var results;
if (getElements.cache[name]) {
results = getElements.cache[name]; // Use the cached value
} else {
results = document.getElementsByTagName(name); // Get the desired value
getElements.cache[name] = results; // cache the result
}
return results;
}
getElements.cache = {}; // Initialize the cache
另一种缓存功能
// Were going to get some things.
var getSomeThings = function() {
// Calling something expense to get the things.
var things = somethingExpensive();
// overwriting this function with a function that returns things
getSomeThings = function() {
return things;
}
// call the new function that returns things and return things.
return getSomeThings();
};
第一次调用时,你计算并返回它。第二次,第三次调用时,你只返回东西
另一个例子允许你用一个不同但想法相似的参数来缓存它,这意味着你要缓存一大堆东西,而不是一个
[编辑]
这样做的目的是创建一个名为getSomeThings
的变量。然后为它分配一个函数。当您调用该函数时,它可以将getSomeThings
本身作为变量访问,并可以使用一个新函数对其进行设置
例如:
function getSomethingExpensive() {
...
return 42;
}
var b = function() {
b = getSomethingExpensive();
}
b();
alert(b);
非常感谢。关于(d)哪一个正在将结果存储到缓存中?哪一个正在从缓存中提取结果?关于(e),这个自定义属性是在“幕后”某处定义的吗?也就是说,我没有看到任何创建此属性的代码。d带有“result=getElements.cache[name]”的if语句正在复制缓存中的值。关于(e),请参阅(a)。这是定义。为什么不严格需要初始化该属性?(从a)如果不初始化,则不能使用getElements.cache[name]
,因为函数还没有cache
属性。但是我认为只要使用getElements[name]
@Gnijuohz就可以省略cache属性,这是个好问题。不确定当时我在想什么,但这确实需要初始化以使其成为一个数组。我已经相应地编辑了这篇文章。谢谢。关于3,如果删除了getElements.cache[name]=results,那么所需的值将存储在变量results中。当您提到“遍历Dom”时,您是指需要从变量中提取所需的值吗?行“document.getElementsByTagName(name);”从Dom(文档对象模型,即HTML的内部表示)获取信息这是一棵树,从中获取信息比仅仅读取一个对象的属性要昂贵。好的,非常感谢,但这引出了另一个问题。但既然“做”了
function getSomethingExpensive() {
...
return 42;
}
var b = function() {
b = getSomethingExpensive();
}
b();
alert(b);