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,并且返回关联数组。
这样,这个参数映射函数就完成了。
先来看下面的例子:
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; }
相关文章推荐
- JavaScript中函数的形参和实参的实现原理剖析
- JavaScript形参和实参
- Javascript的形参和实参
- JavaScript中函数的形参和实参的实现原理剖析
- 形参,实参,传值,传地址,传引用
- 用 Ajax 和 Persevere 将 JavaScript 对象映射到服务器数据
- 基础系列(关于实参,形参,以及指针)
- 趣题:构造一个[0,1]到(0,1)的一一映射
- 什么叫实参 形参 怎么用 区别
- 用Javascript写的一个映射表(MAP)类--续
- 二维数组名作为实参或者形参
- 也许是你一直没有弄懂的问题系列之<函数的形参和实参特点及区别>
- 用二维数组名作形参、实参,求3行4列矩阵中的最大值
- 总结:数组作为实参的传送及函数中的形参接受
- C/C++中二维数组作函数形参时,调用函数时,可传递的实参类型的小结
- 在c语言中怎样使形参值改变实参值也跟着改变呢,c语言的初始化的几个小例子。
- 二维数组名作为实参或者形参
- 【代码】结构体做函数参数,实现形参向实参传递值
- 用二维数组名作形参、实参,求3行4列矩阵中的最大值(二)
- 非类型形参的模板实参