Javascript.RU

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

заменить функцию на функцию с другими параметрами вызовом самой функции
подскажите пожалуйста что изменить в foo чтобы получить тотже результат в строке 15
заменив 13 строку на 14.
function foo(a, b) {
         var one = a,
             two = b;
         return function () {
             if (arguments.length) {
                 return foo.apply(null, arguments)
             }
             return one + two
         }
     }
var test = foo(1, 7);
alert(test());//8
test = test(2, 3) //как заменить на
//test(2, 3)
alert(test())//5
Ответить с цитированием
  #2 (permalink)  
Старый 26.03.2014, 23:45
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Никак. В данном случае, чтобы получить нужное поведение, можно сделать так:
if (arguments.length) {
    one = arguments[0]
    two = arguments[1]
    return arguments.callee
}

Т.е. решай свою задачу, изменяя поведение, а функцию.
Ответить с цитированием
  #3 (permalink)  
Старый 27.03.2014, 00:09
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

рони,
// ну прости, название поумнее придумать не смог ))
function cachify (func) {
  var args = [];
  return function () {
    arguments.length && (args = [].slice.call(arguments, 0));
    return func.apply(this, args);
  };
}

function foo (a, b) {
  return a + b;
}

var test = cachify(foo);
console.log(test(1, 7)); // 8
console.log(test());     // 8
console.log(test(2, 3)); // 5
console.log(test());     // 5
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #4 (permalink)  
Старый 27.03.2014, 00:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

Дзен-трансгуманист,
спасибо ))) может есть ещё варианты
Ответить с цитированием
  #5 (permalink)  
Старый 27.03.2014, 00:38
Аватар для nice_try
Профессор
Отправить личное сообщение для nice_try Посмотреть профиль Найти все сообщения от nice_try
 
Регистрация: 11.12.2013
Сообщений: 313

http://jsfiddle.net/uqbWG/4/

Последний раз редактировалось nice_try, 27.03.2014 в 00:45.
Ответить с цитированием
  #6 (permalink)  
Старый 27.03.2014, 00:40
Аватар для nice_try
Профессор
Отправить личное сообщение для nice_try Посмотреть профиль Найти все сообщения от nice_try
 
Регистрация: 11.12.2013
Сообщений: 313

не, ну если накручивать как дзена, то проще делать через конструктор и методы, в учебнике есть похожая задача
Ответить с цитированием
  #7 (permalink)  
Старый 27.03.2014, 00:46
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

всё в одном флаконе замечательно ... но хочется варианта с каким нибудь this, если конечно он возможен.
function foo(a, b) {
         var func = function (one, two) {
             return (one || a) + (two || b)
         }, args = [];
         return function () {
             arguments.length && (args = [].slice.call(arguments, 0));
             return func.apply(this, args)
         }
     };

var test = foo(1,7);
alert(test())
alert(test())
test(2, 3)
alert(test())
alert(test())
Ответить с цитированием
  #8 (permalink)  
Старый 27.03.2014, 00:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,123

nice_try,
и вам спасибо
Ответить с цитированием
  #9 (permalink)  
Старый 27.03.2014, 00:54
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от рони
всё в одном флаконе
function foo(a, b) {
         var func = function (one, two) {
             return (one || a) + (two || b)
         }, args = [];
         return function () {
             arguments.length && (args = [].slice.call(arguments, 0));
             return func.apply(this, args)
         }
     };

var test = foo(1,7);
alert(test())
test(0, 3)
alert(test()) // ой!

__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
  #10 (permalink)  
Старый 27.03.2014, 00:57
Аватар для Дзен-трансгуманист
√₋̅₁̅
Отправить личное сообщение для Дзен-трансгуманист Посмотреть профиль Найти все сообщения от Дзен-трансгуманист
 
Регистрация: 18.06.2012
Сообщений: 385

Сообщение от nice_try
если накручивать как дзена
Ну так я общую идею показал, конечно гонять массивы будет неэффективно в данном случае.
__________________

Гейзенберг, возможно, читал этот тред.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
передать анонимную функцию, вызывающую другую функцию с нужными параметрами Ваяс Общие вопросы Javascript 5 21.02.2013 20:12
Как передать функцию с параметрами в качестве аргумента другой функции DragorWW Общие вопросы Javascript 11 08.01.2013 16:59
передача функции с параметрами в функцию oli Общие вопросы Javascript 3 09.08.2012 13:52
Как заменить встроенную функцию Alert? KIVagant Общие вопросы Javascript 4 22.04.2010 11:13