2015-10-06 7 views
2

Это мой ленивый погрузчик для функций:Ленивая загрузка с несколькими аргументами

var make_lazy = function (calledFunc, a, b, c, d, e, f) { 
    return function() { 
     return calledFunc(a, b, c, d, e, f) 
    } 
}; 

Он работает с большинством функций, кроме этого:

function superAdd() { 
    return Array.prototype.slice.apply(arguments).reduce(function (a, c) { 
     return a + c; 
    }, 0); 
} 

Как изменить эту функцию, чтобы принимать переменное число аргументов? Я попытался использовать объект аргументов без успеха.

+2

Где вы звоните 'superAdd'? Можете ли вы показать полный пример реализации, который не работает? –

+0

@Josh Beam Я использую единичный тест var lazy_value = make_lazy (superAdd, 3, 5); Test.expect (lazy_value() === 15, 'Вычисляет выражение при необходимости'); – webdev5

+0

'function make_lazy (fn, args) {return Function.apply.bind (fn, this, args);};' – dandavis

ответ

1
/** 
* @param args {Array} 
*/ 
var make_lazy = function(calledFunc, args) { 
    return function() { 
    return calledFunc.apply(this, args); 
    } 
}; 

var lazy = make_lazy(superAdd, [3, 5]); 

lazy(); // => 8 

С вышесказанным вы можете просто группировать неопределенное количество аргументов в массив.

Способ, описанный выше, состоит в том, что у вас есть переменное количество аргументов, только после аргумента сначала (который является детерминированным).

С ES6, это даже круче, используя спред оператора:

function make_lazy(calledFunc, ...args) { 
    return() => calledFunc(...args); 
} 
+0

Решение ES6 сработало. – webdev5

1

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

var make_lazy = function (calledFunc) { 
 
    return function() { 
 
     return calledFunc.apply(null,arguments); 
 
    } 
 
}; 
 

 
function one(a){ 
 
    console.log("how many args: "+arguments.length,a); 
 
} 
 
function two(a,b){ 
 
    console.log("how many args: "+arguments.length,a,b); 
 
} 
 
function three(a,b,c){ 
 
    console.log("how many args: "+arguments.length,a,b,c); 
 
} 
 

 
var onelazy = make_lazy(one); 
 
var twolazy = make_lazy(two); 
 
var threelazy = make_lazy(three); 
 
onelazy(1); 
 
twolazy(1,2); 
 
threelazy(1,2,3);

Или если вы хотите передать предопределенные значения в качестве аргументов, просто получите аргументы из make_la zy (за исключением первого аргумента) и использовать это для вызова приложения.

var make_lazy = function (calledFunc) { 
    var args = [].splice.call(arguments,1); 
    return function() { 
     return calledFunc.apply(null,args); 
    } 
}; 
function two(a,b){ 
    console.log("Num Args: "+arguments.length,a,b); 
} 
var twoLazy = make_lazy(two,3,5); 
twoLazy(); 
1

Я предполагаю, что проблема у вас возникли с версией аргументы функции make_lazy является то, что вы используете неправильный список аргументов, таких как:

var make_lazy = function (calledFunc) { 
     return function() { 
     return calledFunc.apply(null, arguments); 
     }; 
    }; 

arguments в том, что ссылки заявление аргументы возвращаемого функция, такие, что

var lazy = make_lazy(superAdd, 1, 2, 3); 
    lazy(3,4,5); 
    // returns 12 -not- 6 

, потому что она только принимает в аргументах, которые применяются при lazy Выполнение. Функция make_lazy должна хранить аргументы во время выполнения, чтобы впоследствии использовать их.

Так, чтобы ответить на ваш вопрос, магазин arguments в качестве переменной внешней сферы внутренней возвращаемой функции:

var make_lazy = function (calledFunc) { 

     // Remove the calledFunc from the arguments list by passing in `1` to slice. 
     var lazyArgs = Array.prototype.slice.call(arguments, 1); 

     return function() { 
     return calledFunc.apply(null, lazyArgs); 
     }; 
    }; 
Смежные вопросы