Кэширование возвращаемых результатов функции из JavaScript обучения Джона Резига. - PullRequest
3 голосов
/ 17 марта 2011

У меня есть несколько вопросов об этой функции из упражнения Джона Резига № 19 в http://ejohn.org/apps/learn/#19

  1. какова цель второй последней строки getElements.cache = {}; Хранит ли она return results в массиве?

  2. Если моя догадка в (1) верна, то только ли она ловит return results, потому что в разделе "else" функции, getElements.cache[name] = results;?

  3. когда я играл с кодом в консоли в руководстве, я удалил строку getElements.cache[name] = results из раздела "else", но все равно получил тот же результат, что и когда он был там, а именно:он сказал мне, что было 76 элементов.Какова же цель этой строки getElements.cache[name] = results, если нет необходимости получать результат?

  4. имеет какое-либо значение для того факта, что в "else"В секции функции порядок строки getElements.cache[name] = results; меняется на противоположный от секции if кода, где написано results = getElements.cache[name]

  5. и, наконец, cache aпредопределенная функция в 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 );

Ответы [ 3 ]

4 голосов
/ 17 марта 2011

а) От второй до последней строки устанавливается, что свойство «кеш» объекта getElements является объектом. По сути, инициализация этого свойства.

b) Это будет кеш, представьте getElements как объект, а кеш - это хеш, который удерживает результаты.

в) Да, вы все равно получите тот же результат, потому что кеш просто кеширует, в любом случае он не меняет ответ, он просто потенциально ускоряет процесс.

d) Да, один сохраняет результат в кеше, другой вытаскивает результат из кэша.

e) Нет, это пользовательское свойство, определенное для "getElements", может быть задано любое их число с разными именами.

2 голосов
/ 17 марта 2011

Альтернативная функция кэширования

// 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);
2 голосов
/ 17 марта 2011

1.- какова цель второго последнего линия getElements.cache = {}; Это хранить возвращаемые результаты в массиве?

Это просто инициализация объекта

2.- Если мое предположение в (1) верно, верно только ловить возвращаемые результаты, потому что, в разделе «еще» функции, getElements.cache[name] = results;

Да, он использует метод кэширования, чтобы избежать доступа к DOM.

3.- когда я играл с кодом в консоль в учебнике, я удалил линия getElements.cache[name] = results из раздела "еще", но все же получил тот же результат, что и когда это было там, а именно, он сказал мне, что там было 76 элементов. Что, следовательно, цель этой линии getElements.cache[name] = results если не нужно ли получать результат?

В действительности нет необходимости в том смысле, что она только заставляет функцию возвращаться быстрее, поскольку доступ к объекту быстрее, чем через DOM.

4.- есть ли какое-либо значение для факта что в разделе «еще» функция, порядок строки getElements.cache[name] = results; есть по сравнению с разделом если из код, где написано 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...