从计算1+1的sum函数来聊聊javascript。
程序代码:
/** * @method sum1 求和函数 * @param a { Number } 参数1 * @param b { Number } 参数2 * @return { Number } 两个参数的和 */ function sum1(a,b){ return a+b; }
程序代码:
/** * @method sum2 求和函数 * @param list { Array } 一个列表 * @return { Number } 列表中所有元素的和 */ function sum2(list){ var s = 0; for(var i=0;i<list.length;i++){ s = s + list[i]; //也可写为 s += list[i]; } return s; }
var list = [1,2,3]; alert(sum2(list));
程序代码:
/** * @method sum 求和函数 * @param ... 若干参数 * @return { Number } 所有形参的和 */ function sum3(){ var s = 0; for(var i=0;i<arguments.length;i++){ s = s + arguments[i]; //也可写为 s += arguments[i]; } return s; }
程序代码:
/** * @method sum4 求和函数 * @param a { Number } 参数1 * @param b { Number } 参数2 * @return { Number } 两个参数的和 */ function sum4(a, b){ return a+b; } /** * @method sum4 求差函数 * @param a { Number } 参数1 * @param b { Number } 参数2 * @return { Number } 参数1和参数2的差 */ function sub(a, b){ return a-b; } /** * @method trans_multi 将函数转换为多参数版本 * @param fn {Function} 待转换函数 * @return {Function} 转换后的函数 */ function trans_multi(fn){ return function(){ var args = arguments; var first = args[0]; for(var i=1;i<args.length;i++){ first = fn(first, args[i]); } return first; } }
var multi_sum = trans_multi(sum4);
var multi_sub = trans_multi(sub);
alert(multi_sum(1,2,3));
alert(multi_sub(3,2,1));
程序代码:
/** * @method sum5 递归求和函数(依靠栈保存累加值) * @param ... 多个形参 * @return { Number } 形参的和 */ function sum5(){ var args = Array.prototype.slice.call(arguments); if(args.length){ return args[0] + sum5.apply(null, args.slice(1)); }else{ return 0; } } alert(sum5(1,2,3)); /** * @method sum6 递归求和函数(依靠参数保存累加值) * @param ... 多个形参 * @return { Number } 形参的和 */ function sum6(list, sum){ if( !(list instanceof Array) ){ return sum6.call(null, Array.prototype.slice.call(arguments), 0); }else{ if(list.length){ return sum6(list.slice(1), list[0]+sum); }else{ return sum; } } } alert(sum6(1,2,3)); /** * @method plat_recursive 递归平坦化 * @param fn {Function} 递归函数 * @return {Any} 将递归平坦化后的返回值 */ function plat_recursive(fn){ return function(init){ var i=0, args=Array.prototype.slice.call(arguments), len=args.length; if(!init){ for(; i<len; i++){ if(i in args){ init = args[i]; break; } } } i+=1; for(; i<len; i++){ init = fn(init, args[i]); } return init; }; } var plat_sum5 = plat_recursive(sum5); var plat_sum6 = plat_recursive(sum6); alert(plat_sum5(1,2,3)); alert(plat_sum6(1,2,3));
[ 本帖最后由 chaoslee 于 2011-5-16 13:33 编辑 ]