javascript - how capture the arguments number need in a function (currying function partial application) -
i working on curring function , partial application, trying improve function schonfinkelize:
function schonfinkelize(fn){ var slice = array.prototype.slice, stored_args = slice.call(arguments, 1); return function(){ var new_args = slice.call(arguments), args = stored_args.concat(new_args); return fn.apply(null, args); } } this function permit pass argument function , a part of argument of function passed argument (partial application) first time return function , when fire function again result.
function add(x, y, z){ return x + y + z; } var val = schonfinkelize(add, 1, 2); console.log( val(3) ) // console output--> 6 i want check inside schonfinkelize number of arguments need function "add" (but should work every function) can choose when return function or directly result of function "add".
bacause if use schonfinkelize in way:
var val2 = schonfinkelize(add, 1, 2, 3); console.log( val2 ) // --> function console.log( val2() ) // --> 6 i have fire function 2 time, instead want avoid behavior , define directly value if arguments sufficient.
a possible solution following:
function schonfinkelize(fn){ var slice = array.prototype.slice, stored_args = slice.call(arguments, 1); //* have added ******** if(fn.apply(null, stored_args)) return fn.apply(null, stored_args); //**************************** return function(){ var new_args = slice.call(arguments), args = stored_args.concat(new_args); return fn.apply(null, args); } } could because returns result if fn.apply(null, stored_args) return not "null" or "nan" think not performant , want work arguments.
as long put in place requirement parameters defined function passed reflect number of arguments received, can use .length property of function comparison of passed arguments anticipated arguments.
function schonfinkelize(fn) { if (fn.length === arguments.length - 1) return fn.apply(this, [].slice.call(arguments, 1)); var slice = array.prototype.slice, stored_args = slice.call(arguments, 1); return function(){ var new_args = slice.call(arguments), args = stored_args.concat(new_args); return fn.apply(null, args); } } side note... can avoid .slice() if cache fn in new variable, , overwrite first argument this value, use .call.apply()...
if (fn.length === arguments.length - 1) { var func = fn; arguments[0] = this; return func.call.apply(func, arguments); } in strict mode browsers avoid having make new variable since parameters no longer mapped changes in arguments. doesn't work in browsers don't support strict mode.
Comments
Post a Comment