如何在javascript中识别函数的参数名称?

Mat*_*ork 10 javascript dependency-injection angularjs

在AngularJS中,这两个控制器声明是等效的:

function BlahCtrl($scope, $http) { ... }
function BlahCtrl($http, $scope) { ... }
Run Code Online (Sandbox Code Playgroud)

双方$http$scope会正确的变量,不管他们是什么样的顺序,即命名变量$http将始终通过实例$http的服务.

Angular如何知道传入哪些对象以及以什么顺序传递?我认为javascript无法实现这种反射.

Den*_*nis 13

如果调用toString函数,则获得该函数的js声明:

function a(b,c) {}

a.toString();  // "function a(b,c){}"
Run Code Online (Sandbox Code Playgroud)

然后你可以解析字符串的参数顺序.

角度源代码的一些调查证实了这一点:

if (typeof fn == 'function') {
  if (!($inject = fn.$inject)) {
    $inject = [];
    fnText = fn.toString().replace(STRIP_COMMENTS, '');
    argDecl = fnText.match(FN_ARGS);
    forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
      arg.replace(FN_ARG, function(all, underscore, name){
        $inject.push(name);
      });
    });
    fn.$inject = $inject;
  }
}
Run Code Online (Sandbox Code Playgroud)

它们对函数进行字符串化,然后使用正则表达式提取参数并将它们存储在数组中.

jsFiddle显示这一切是如何工作的.