<html>
<head>
<meta charset="utf8" />
<title>链式调用</title>
<script type="text/javascript">
//该函数的作用就是,函数参数和使用函数位置调换。还需要完善的是,去掉第一个参数,也就是函数位置指定。因为不知道,var arg = [1,2];使function(arg)等同于function(1,2),所以用了很笨拙,很冗余的代码写法。这个函数也暂时支持最多3参数。
Array.prototype.wsc = function(func){
var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length;return_array = [],func_positon= Arg[0] || 0,real_func = Arg[func_positon];
if(Arg_length == 1){
for(var i=0; i<original_arry_len; i++){
return_array[i] = func(original_arry[i]);
}
}
else if(Arg_length == 3){
if(func_positon == 1){
for(var i=0; i<original_arry_len; i++){
return_array[i] = real_func(original_arry[i],Arg[2]);
}
}
else if(func_positon == 2){
for(var i=0; i<original_arry_len; i++){
return_array[i] = real_func(Arg[1],original_arry[i]);
}
}
}
else if(Arg_length == 4){
if(func_positon == 1){
for(var i=0; i<original_arry_len; i++){
return_array[i] = real_func(original_arry[i],Arg[2],Arg[3]);
}
}
else if(func_positon == 2){
for(var i=0; i<original_arry_len; i++){
return_array[i] = real_func(Arg[1],original_arry[i],Arg[3]);
}
}
else if(func_positon == 3){
for(var i=0; i<original_arry_len; i++){
return_array[i] = real_func(Arg[1],Arg[2],original_arry[i]);
}
}
}
return return_array;
}
function double(x){
return x * 2;
}
function inc(x,y){
return x + y;
}
function ind(x,y,z){
return x + y + z;
}
var numTemp = [1, 2, 3].wsc(double).wsc(double).wsc(double);
// var numTemp = [1, 2, 3].wsc(2,3,inc);//函数第一个参数是指调用函数的位置,这里的2表示,调用函数位置在第二位,于是调用函数跟调用函数的第二个参数,调换了位置。
// var numTemp = [1, 2, 3].wsc(1,ind,2,3);
console.log(numTemp);
</script>
</head>
<body></body>
</html>
接下来是一个柯里化的版本
<!DOCTYPE html> <html> <head> <meta charset="utf8" /> <title>后序语法之函数参数和函数的位置调换</title> <script type="text/javascript"> //函数参数和函数的位置调换 var wsc = function(func_position){ return function(){ var original_arry_len = this.length ,original_arry = this, Arg = arguments,Arg_length = arguments.length,return_array = [],real_func = Arg[func_position-1]; for(var j=0; j<original_arry_len;j++){//数组遍历 var Arg_array = []; for(var i=0; i<Arg_length; i++){//遍历参数列表,然后找出实际函数所在位置,用数组元素代替 if(func_position-1 == i){ Arg_array.push(original_arry[j]) } else{ Arg_array.push(Arg[i]); } } return_array[j] = real_func.apply(null,Arg_array); } return return_array; }; } function double(x){ return x * 2; } function inc(x,y){ return x + y; } function ind(x,y,z){ return x + y + z; } Array.prototype.wsc1 = wsc(1);//指定实际函数在参数1位置。为什么要指定位置呢,本来是通过检测参数里面的类型是否函数,是则得出位置;后来发现,有些函数专门处理函数,所以这方法行不通。所以要指定位置。 var numTemp1 = [1,2,3].wsc1(double); Array.prototype.wsc2 = wsc(2);//指定实际函数在参数2位置 var numTemp2 = [1,2,3].wsc2(2,inc); Array.prototype.wsc3 = wsc(2); var numTemp3 = [1,2,3].wsc2(2,ind,3).wsc1(double); console.log(numTemp1); console.log(numTemp2); console.log(numTemp3); var numTemp4 = [1,2,3]; numTemp4.wsc1 = wsc(1); console.log(numTemp4.wsc1(double)); </script> </head> <body> </body> </html>
合乎自然而生生不息。。。