Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   заменить функцию на функцию с другими параметрами вызовом самой функции (https://javascript.ru/forum/misc/46076-zamenit-funkciyu-na-funkciyu-s-drugimi-parametrami-vyzovom-samojj-funkcii.html)

рони 26.03.2014 23:23

заменить функцию на функцию с другими параметрами вызовом самой функции
 
подскажите пожалуйста что изменить в 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

Sweet 26.03.2014 23:45

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

Т.е. решай свою задачу, изменяя поведение, а функцию.

Дзен-трансгуманист 27.03.2014 00:09

рони,
// ну прости, название поумнее придумать не смог ))
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

рони 27.03.2014 00:16

Дзен-трансгуманист,
спасибо ))) может есть ещё варианты

nice_try 27.03.2014 00:38

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

nice_try 27.03.2014 00:40

не, ну если накручивать как дзена, то проще делать через конструктор и методы, в учебнике есть похожая задача

рони 27.03.2014 00:46

:write: всё в одном флаконе замечательно ... но хочется варианта с каким нибудь 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())

рони 27.03.2014 00:50

nice_try,
и вам спасибо

Дзен-трансгуманист 27.03.2014 00:54

Цитата:

Сообщение от рони
всё в одном флаконе

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()) // ой!

:)

Дзен-трансгуманист 27.03.2014 00:57

Цитата:

Сообщение от nice_try
если накручивать как дзена

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


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