缓存John Resig';s学习高级JavaScript

缓存John Resig';s学习高级JavaScript,javascript,Javascript,关于这个函数,我有几个问题来自John Resig的练习#19 最后第二行getElements.cache={}的用途是什么是否将返回结果存储在数组中 如果我在(1)中的猜测是正确的,它是否只捕获返回结果,因为在函数的“else”部分,getElements.cache[name]=results 在本教程中,当我在控制台中玩代码时,我从“else”部分删除了行getElements.cache[name]=results,但仍然得到了与当时相同的结果,即它告诉我有76个元素。因此,如果不需要

关于这个函数,我有几个问题来自John Resig的练习#19

  • 最后第二行
    getElements.cache={}的用途是什么
    是否将
    返回结果
    存储在数组中

  • 如果我在(1)中的猜测是正确的,它是否只捕获
    返回结果
    ,因为在函数的“else”部分,
    getElements.cache[name]=results

  • 在本教程中,当我在控制台中玩代码时,我从“else”部分删除了行
    getElements.cache[name]=results
    ,但仍然得到了与当时相同的结果,即它告诉我有76个元素。因此,如果不需要获取结果,那么此行的目的是什么

  • 在函数的“else”部分,行
    getElements.cache[name]=results的顺序是否有意义与代码的
    if
    部分相反,该部分表示
    results=getElements.cache[name]

  • 最后,
    cache
    是JavaScript中的预定义函数吗?我在文档中找不到它

  • a) 倒数第二行确定对象getElements上的属性“cache”是一个对象。本质上是初始化该属性

    b) 这就是缓存,将getElements视为一个对象,缓存是一个保存结果的散列

    c) 是的,你仍然会得到相同的结果,因为缓存只是缓存,它不会改变答案,它只会潜在地加快速度

    d) 是的,一个将结果存储到缓存中,另一个将结果从缓存中拉出

    e) 否这是为“getElements”定义的自定义属性,可以定义任意数量的具有不同名称的属性

    1.-第二个最后一个的目的是什么 行
    getElements.cache={}是吗
    在数组中存储返回结果

    它只是初始化对象

    2.-如果我在(1)中的猜测是正确的,是吗 只捕捉返回结果是因为, 在函数的“else”部分,
    getElements.cache[name]=结果

    是的,它使用缓存方法来避免访问DOM

    -当我在游戏中玩代码时 在教程中,我删除了 line
    getElements.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);