角度源代码

时间:2015-08-01 14:46:59

标签: javascript regex angularjs

只需阅读角度源代码中的以下代码即可。它是依赖注入的一部分。基本上这更多是关于正则表达式。

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var $injectorMinErr = minErr('$injector');
function annotate(fn) {
  var $inject,
      fnText,
      argDecl,
      last;

  if (typeof fn === 'function') {
    if (!($inject = fn.$inject)) {
      $inject = [];
      if (fn.length) {
        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;
    }
  } else if (isArray(fn)) {
    last = fn.length - 1;
    assertArgFn(fn[last], 'fn');
    $inject = fn.slice(0, last);
  } else {
    assertArgFn(fn, 'fn', true);
  }
  return $inject;
}

我尝试在Chrome控制台中运行下面的代码,让我困惑的是第二个元素来自哪里?

至于我的理解,我认为它应该只返回第一个元素function testService(testService, loginService)

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var testFunc = function testService (testService, loginService) {
    loginService.login();
}
var str = testFunc.toString();
var arr = str.match(FN_ARGS);
console.log(arr);
//["function testService(testService, loginService)", "testService, loginService"]

有人可以帮我解决这个问题,谢谢。

1 个答案:

答案 0 :(得分:1)

如果

match在索引0处匹配,则返回整个字符串。其他索引表示已匹配的正则表达式组。您可以使用括号在正则表达式中声明一个组。在这种情况下,该组为([^\)]*)