Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Поясните код (https://javascript.ru/forum/misc/36699-poyasnite-kod.html)

xfreewindx 25.03.2013 09:54

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

Создайте декоратор 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. Как-то закольцованно получается.
Что-то я не могу до конца код догнать.

rgl 25.03.2013 10:59

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

А что это за учебник?

xfreewindx 25.03.2013 12:35

Тот что на этом сайте, раздел декораторы.
Спасибо.

Ervin 25.03.2013 13:05

Цитата:

У нас есть функция f, потом мы еще ей же присваиваем функцию makeCaching, переопределяем f. Как-то закольцованно получается.
Согласен. Ошибки не будет, т.к. переменная переназначается только после выполнения всей части справа от знака назначения. Тем не менее я не стараюсь не использовать такие конструкции ибо для меня это логический не совсем верно, но это лишь мой стиль.

rgl 25.03.2013 15:23

Цитата:

Сообщение от xfreewindx (Сообщение 242460)
У нас есть функция f, потом мы еще ей же присваиваем функцию makeCaching

Нет, присваиваем не функцию makeCaching а то, что она возвращает (хотя тоже функцию).

melky 25.03.2013 17:54

Цитата:

Сообщение от Ervin (Сообщение 242505)
Согласен. Ошибки не будет, т.к. переменная переназначается только после выполнения всей части справа от знака назначения. Тем не менее я не стараюсь не использовать такие конструкции ибо для меня это логический не совсем верно, но это лишь мой стиль.

если думать о том, что всё в коде исполняется последовательно, то может понимать легче будет :)

rgl 25.03.2013 18:28

Гы, приведенное решение не совсем хорошее, вот:
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


Часовой пояс GMT +3, время: 20:08.