2011-03-17 56 views
3

我在http://ejohn.org/apps/learn/#19緩存函數的返回結果從約翰Resig的學習先進的JavaScript

  1. 來自約翰Resig的鍛鍊#19這個功能的幾個問題什麼是倒數第二行的目的getElements.cache = {};是它將return results存儲在數組中?

  2. 如果我在(1)中的猜測是正確的,那麼它僅捕獲return results,因爲在函數的「else」部分中,getElements.cache[name] = results;

  3. 當我在教程中使用控制檯中的代碼玩遊戲時,我從「else」部分刪除了行getElements.cache[name] = results,但仍然得到了與當時的結果相同的結果 - 即告訴我:有76個元素。因此,如果沒有必要得到結果,這條線的目的是什麼?getElements.cache[name] = results

  4. 是有這樣的事實,該功能的「其他」部分中,該行getElements.cache[name] = results;的順序從代碼的if部分,它說:results = getElements.cache[name]

  5. 終於扭轉任何意義,是cache在JavaScript中的預定義函數?我無法在文檔中找到它。

function getElements(name) { 
    var results; 

    if (getElements.cache[name]) { 
    results = getElements.cache[name]; 
    } else { 
    results = document.getElementsByTagName(name); 
    getElements.cache[name] = results; 
    } 

    return results; 
} 
getElements.cache = {}; 

log("Elements found: ", getElements("pre").length); 

回答

4

一)第2〜最後一行規定,在對象的getElements屬性「緩存」是一個對象。基本上初始化該屬性。

b)這將是緩存,將getElements視爲對象,並且緩存是保留在結果中的散列。

c)是的,你仍然會得到相同的結果,因爲緩存只是緩存,它不會改變答案,它只會潛在地加快速度。

d)是的,一個是將結果存儲到緩存中,另一個是將結果從緩存中取出。 e)不是這是爲「getElements」定義的自定義屬性,可以定義具有不同名稱的任意數量的屬性。

+0

非常感謝你。 (d)哪一個正在將結果存儲到緩存中?以及哪一個將結果從緩存中提取出來?關於(e),這個定製屬性是在某處「後臺」定義的嗎?即我看不到任何創建此屬性的代碼。 – mjmitche 2011-03-17 01:51:12

+0

d帶有「result = getElements.cache [name]」的if語句正在複製緩存中的值。關於(e),參見(a)。這是定義。 – Myles 2011-03-17 01:59:44

+1

爲什麼初始化該屬性不是必須的?(from a))如果你不這樣做,你不能使用'getElements.cache [name]',因爲該函數還沒有'cache'屬性。但我認爲只需使用'getElements [name]'就可以省略緩存屬性。 – Gnijuohz 2012-08-06 07:07:59

2

1.-什麼是倒數第二個 線getElements.cache = {};的目的是什麼呢 保存返回結果的數組?

這只是初始化對象

2:如果(1)我的猜測是正確的,它是唯一的 捕回的結果,因爲, 功能的「其他」部分中, getElements.cache[name] = results;

是的,它使用緩存方法來避免訪問DOM。

3。 - 當我在教程中使用 控制檯中的代碼時,我從「else」部分中刪除了 行getElements.cache[name] = results ,但仍得到 的結果,就像它在 那裏一樣 - 即它告訴我有 是76個元素。因此,什麼是 該行的用途 getElements.cache[name] = results如果 它沒有必要得到結果?

從某種意義上講,它只是使得函數返回速度更快,因爲訪問對象比遍歷DOM更快。

4.-是有這樣的事實 的是, 功能的「其他」部分,線路 getElements.cache[name] = results;的順序是 從 代碼,其中的中頻部分逆轉任何意義它說results = getElements.cache[name]

在其他部分中,首先,results變量分配與實際結果的值,然後將結果被緩存。在當時的部分,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 
+0

謝謝。關於3,如果getElements.cache [name] =結果已被刪除,則所需值將被存儲在變量結果中。當你提到「遍歷Dom」時,你指的是需要從變量中提取期望值的事實嗎? – mjmitche 2011-03-17 02:01:03

+0

行「document.getElementsByTagName(name);」正在從DOM(文檔對象模型,即HTML的內部表示)獲取信息,這是一棵樹,從中獲取信息比讀取對象的屬性更昂貴。 – Marcelo 2011-03-17 02:09:38

+0

o.k.,非常感謝,但是這引發了另一個問題。但由於「document.getElementsByTagName(name)」在代碼中,因此不是執行這兩個操作的函數。即「訪問對象」(使用緩存)和「遍歷DOM」(使用getElementByID?)如果緩存的目的是使它比遍歷Dom更便宜,爲什麼函數不能這麼做呢?甚至更貴?不是最便宜的東西去掉文檔。getElementsByTag(name)? – mjmitche 2011-03-17 02:14:04

2

一種替代高速緩存功能

// 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); 
+0

非常感謝。你能否更詳細地解釋它是如何在第二次和第三次調用中跳過計算部分的。函數如何getSomeThings = function(){return things; }實際上「覆蓋」somethingExpensive()函數? – mjmitche 2011-03-17 02:08:04

+0

@mjmitche查看編輯。你不重寫一些東西昂貴的覆蓋getSomeThings本身,所以它永遠不會調用一些昂貴的東西。 – Raynos 2011-03-17 02:12:49

+0

非常感謝。現在明白了。 – mjmitche 2011-03-17 02:20:13