Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.03.2013, 09:54
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

Поясните код
Здравствуйте!
Еще вопрос по задачке из учебника:

Создайте декоратор makeCaching(f), который берет функцию f и возвращает обертку, которая кеширует её результаты.

function f(arg) { 
  return Math.random()*arg; // может быть любой функцией
}

function makeCaching(f) { /* ваш код */ }

f = makeCaching(f);

var a, b;

a = f(1);
b = f(1);
alert( a == b ); // true (значение закешировано)

b = f(2);
alert( a == b ); // false, другой аргумент => другое значение


Скажите, случайно в этой строчке нет ошибки?
f = makeCaching(f);
У нас есть функция f, потом мы еще ей же присваиваем функцию makeCaching, переопределяем f. Как-то закольцованно получается.
Что-то я не могу до конца код догнать.
Ответить с цитированием
  #2 (permalink)  
Старый 25.03.2013, 10:59
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Формально все правильно, хотя понятнее было бы, если первую строчку заменить на
function f(arg) {
var f = function(arg) {

А что это за учебник?
Ответить с цитированием
  #3 (permalink)  
Старый 25.03.2013, 12:35
Аспирант
Отправить личное сообщение для xfreewindx Посмотреть профиль Найти все сообщения от xfreewindx
 
Регистрация: 19.08.2012
Сообщений: 33

Тот что на этом сайте, раздел декораторы.
Спасибо.
Ответить с цитированием
  #4 (permalink)  
Старый 25.03.2013, 13:05
Аспирант
Отправить личное сообщение для Ervin Посмотреть профиль Найти все сообщения от Ervin
 
Регистрация: 19.03.2013
Сообщений: 84

Цитата:
У нас есть функция f, потом мы еще ей же присваиваем функцию makeCaching, переопределяем f. Как-то закольцованно получается.
Согласен. Ошибки не будет, т.к. переменная переназначается только после выполнения всей части справа от знака назначения. Тем не менее я не стараюсь не использовать такие конструкции ибо для меня это логический не совсем верно, но это лишь мой стиль.
Ответить с цитированием
  #5 (permalink)  
Старый 25.03.2013, 15:23
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Сообщение от xfreewindx Посмотреть сообщение
У нас есть функция f, потом мы еще ей же присваиваем функцию makeCaching
Нет, присваиваем не функцию makeCaching а то, что она возвращает (хотя тоже функцию).
Ответить с цитированием
  #6 (permalink)  
Старый 25.03.2013, 17:54
sinistral
Посмотреть профиль Найти все сообщения от melky
 
Регистрация: 28.03.2011
Сообщений: 5,418

Сообщение от Ervin Посмотреть сообщение
Согласен. Ошибки не будет, т.к. переменная переназначается только после выполнения всей части справа от знака назначения. Тем не менее я не стараюсь не использовать такие конструкции ибо для меня это логический не совсем верно, но это лишь мой стиль.
если думать о том, что всё в коде исполняется последовательно, то может понимать легче будет
Ответить с цитированием
  #7 (permalink)  
Старый 25.03.2013, 18:28
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Гы, приведенное решение не совсем хорошее, вот:
function f(arg) { 
  return arg.toUpperCase(); // может быть любой функцией
}

function makeCaching(f) {
  var cache = {};  

  return function(x) {
    if (!(x in cache)) {   
      cache[x] = f.call(this, x);
    }
    return cache[x];
  };

}

f = makeCaching(f);

alert( f("aaaa") ); // OK
alert( f("toString") ); // Что-то не то :-(

А вот если изменить проверку условия
if (!(x in cache)) {
if (!(cache.hasOwnProperty(x))) {
тогда все OK
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как можно улучшить такой код? Reiter Общие вопросы Javascript 0 06.11.2012 16:19
Требуется выводить код рекламного блока Adsense из файла JavaScript??? speedflow Элементы интерфейса 0 26.05.2012 15:50
Введенный код в prompt() falsenull Общие вопросы Javascript 8 21.05.2012 16:47
Получить код js-скрипта, находящегося в файле на сервере RomanA Общие вопросы Javascript 4 04.04.2012 09:53
код нe работает в фаирфохе dadli Javascript под браузер 2 28.01.2012 21:18