2015-05-19 13 views
0

Мне просто интересно, есть ли способ извлечь аргументы функции x (...) {...} в глобальную область и, возможно, сохранить их в переменную.Извлечь аргументы функции в глобальную область (javaScript)

Я знаю, что если вы создадите функцию, вы можете вернуть объект «arguments», но это не то, что я хочу, потому что функция неизвестна.

Чтобы дать немного контекста относительно того, почему я хочу это сделать, я пытаюсь создать функцию «a», которая получает функцию «x» в качестве параметра, и мне нужно вернуть функцию «y », который при вызове проверяет, если он уже вычислил результат для данного аргумента и, если это возможно, вернет это значение.

Я знаю, что это, вероятно, не лучший подход, чтобы сделать это.

+1

Возможно, вам стоит рассказать нам, какой язык вы используете. –

+0

Полностью! это в javaScript –

ответ

1

Я предполагаю, немного относительно того, что именно вы хотите сделать, но вот структурная идея. Это создает функцию, которая кэширует свои результаты, поэтому для заданного входного аргумента результат вычисляется только один раз (а затем извлекается из кэша после этого). Он предполагает, что аргументом функции является строка или что-то еще, у которого есть уникальное преобразование toString().

var myFunc = (function() { 
    var cache = {}, has = Object.prototype.hasOwnProperty; 
    return function(arg) { 
     if (has.call(cache, arg)) { 
      return cache[arg]; 
     } else { 
      // do your calculation on arg to generate result 
      // ... 
      cache[arg] = result; 
      return result; 
     } 
    } 
})(); 

Эта реализация оптимизирована для функции с одним аргументом, но если вы хотите кэшировать на основе нескольких аргументов, он может быть продлен, что слишком путем построения уникального ключа на основе сочетания всех аргументов и кеширование на основе этого ключа.

+0

Работает до тех пор, пока расчет не даст '' hasOwnProperty'' :-) +1 тем не менее. – Bergi

+0

@Bergi - ОК, я исправил его, чтобы он даже работал с '' hasOwnProperty'' как arg. Я сделал это неуязвимым для этого раньше (как в этом ['Set' implementation] (http://stackoverflow.com/questions/7958292/mimicking-sets-in-javascript/7958422#7958422)), но иногда забывают. – jfriend00

1

Термин для того, что вы пытаетесь сделать, это "memoization", и он не требует экспорта аргументов в глобальную область.

Если вы используете Lodash/подчёркивания имеет built in function для этого:

var calculate = function (num) { 
    console.log('I have been called!'); 
    ... 
}; 

calculate = _.memoize(calculate); 

console.log(calculate(4)); 
console.log(calculate(5)); 
console.log(calculate(4)); 
+0

Спасибо! Это действительно оправдано, но я работаю над реализацией. –

Смежные вопросы