具体实现
function argumentNames(fn) { var ret; // 获取 字符串 形式 var methodCode = fn.toString(); // 获取 '()' 里面的 参数 methodCode.replace(/\((.*)\)/, function (match, g1) { var argStr = g1.replace(/\s/g, ''); // 变成字符串 ret = argStr.length ? argStr.split(',') : []; }); return ret;}// testargumentNames(function(a,b){}) // ['a','b']
具体的实现方式是:在代码运行的时候,拦截这个方法,然后把对应的模块传递给函数的上下文。例如现在的模块化加载实现,seajs,requirejs 中 define() require() 方法的实现,或者看angular的实现
angular.module('myModule',[]);myModule.service('myService',function(a,b){});
对于这些框架的实现:首先对其传入的函数所做的第一件事情就是获取其参数列表,然后再把这个模块保存起来,这样就有了参数列表,也就知道了要注入多少个依赖,在接着,把对应的依赖传入,通过参数形式传进去。
具体代码实现:
待定