财客网
您的当前位置:首页JavaScript趣题:形参和实参的映射

JavaScript趣题:形参和实参的映射

来源:财客网


作为对函数功能的扩展,你需要在一个函数被调用时,在它的形参和实参之间,建立正确的映射关系。

先来看下面的例子:

function func1(arg1, arg2) { ... } 
 
var map = createArgumentMap(func1,'valueOfArg1', 'valueOfArg2'); 
console.log(map['arg1']); // writes 'valueOfArg1' 
console.log(map['arg2']); // writes 'valueOfArg2'

这个映射函数接收一个函数对象作为第一个参数,以及一个长度未知的实参列表,你得在这个函数对象的形参和实参列表间建立映射,用一个关联数组表示,并返回。

实参列表和函数形参定义的顺序是一样的,而且都是有效合法的参数。

这个题目在于建立形参和实参的映射,那么,我们就先获得函数对象的toString()字符串形式,并且截取它的形参列表。

紧接着,因为实参列表长度未知,那么利用Array.prototype.slice方法,设置它的上下文为arguments对象,从索引1处开始截取实参,获得实参列表的数组形式。

最后,以实参列表为基准,建立关联数组,形参为key,实参为value,并且返回关联数组。

这样,这个参数映射函数就完成了。

String.prototype.trim = function(){ 
  return this.replace(/(^\s*)|(\s*$)/g, ""); 
}; 
 
var findArgs = function(funcStr){ 
 var bracket1 = funcStr.indexOf("("); 
 var bracket2 = funcStr.indexOf(")"); 
 var argsStr = funcStr.slice(bracket1+1,bracket2); 
 var args = argsStr.split(","); 
 return args.map(function(e){ 
 return e.trim(); 
 }); 
}; 
 
function createArgumentMap(func) { 
 var args = findArgs(func.toString()); 
 var realArgs = Array.prototype.slice.call(arguments,1); 
 var map = {}; 
 for(var i=0;i<realArgs.length;i++){ 
 map[args[i]] = realArgs[i]; 
 } 
 return map; 
}
显示全文