您的位置:首页 > Web前端 > JavaScript

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

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

先来看下面的例子:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息