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
|
|
26.03.2014, 23:45
|
Профессор
|
|
Регистрация: 16.03.2010
Сообщений: 1,618
|
|
Никак. В данном случае, чтобы получить нужное поведение, можно сделать так:
if (arguments.length) {
one = arguments[0]
two = arguments[1]
return arguments.callee
}
Т.е. решай свою задачу, изменяя поведение, а функцию.
|
|
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
__________________
Гейзенберг, возможно, читал этот тред.
|
|
27.03.2014, 00:16
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
Дзен-трансгуманист,
спасибо ))) может есть ещё варианты
|
|
27.03.2014, 00:38
|
|
Профессор
|
|
Регистрация: 11.12.2013
Сообщений: 313
|
|
Последний раз редактировалось nice_try, 27.03.2014 в 00:45.
|
|
27.03.2014, 00:40
|
|
Профессор
|
|
Регистрация: 11.12.2013
Сообщений: 313
|
|
не, ну если накручивать как дзена, то проще делать через конструктор и методы, в учебнике есть похожая задача
|
|
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())
|
|
27.03.2014, 00:50
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,123
|
|
nice_try,
и вам спасибо
|
|
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()) // ой!
__________________
Гейзенберг, возможно, читал этот тред.
|
|
27.03.2014, 00:57
|
|
√₋̅₁̅
|
|
Регистрация: 18.06.2012
Сообщений: 385
|
|
Сообщение от nice_try
|
если накручивать как дзена
|
Ну так я общую идею показал, конечно гонять массивы будет неэффективно в данном случае.
__________________
Гейзенберг, возможно, читал этот тред.
|
|
|
|