Javascript 如何映射非字符串参数';对象属性名的名称?

Javascript 如何映射非字符串参数';对象属性名的名称?,javascript,angularjs,Javascript,Angularjs,AngularJS将依赖项名称存储为字符串,这很有意义,因为我们可以: var dependencies = {}; function addDependency(name, value){ if (typeof name == 'string') { dependencies['name'] = value; } else { //throw err } } 但我不明白如何能够像AngularJS那样通过非字符串参数掌握该值,它告诉您为了访问依赖项,

AngularJS将依赖项名称存储为字符串,这很有意义,因为我们可以:

var dependencies = {};
function addDependency(name, value){
   if (typeof name == 'string') {
      dependencies['name'] = value;
   } else {
      //throw err
   }
}
但我不明白如何能够像AngularJS那样通过非字符串参数掌握该值,它告诉您为了访问依赖项,只需将参数视为名称:

获取依赖关系的最简单方法是假设 函数参数名称是依赖项的名称

someModule.controller('MyController', 
    function($scope, greeter) {
       // ...
    });
在上述情况下,我认为
greeter
必须是字符串的形式,这样才能在类似
dependencies[argument[I]]的循环中访问它
我只是不明白,如果参数不是字符串,在JavaScript中如何将该参数的名称映射到某个依赖项名称。这怎么可能?我真的很想知道如何对代码中的各种语法进行改进

有可能:

var foo = function(foo, bar) {};
foo.toString();
"function (foo, bar) {}"
现在,通过一点正则表达式解析,您可以获得参数的名称。这就是Angular所做的。这有点像黑客,令人泄气。您可以在应用程序中使用
ng strict di
,在未声明显式di的情况下抛出错误

Angular定义了很多明确声明依赖项的方法

我建议使用static
$inject
属性

MyController.$inject = ['$scope', 'greeter'];
function MyController($scope, greeter) { // . . . }

他们很可能使用类似反射的代码。例子:啊。。这个问题的第二个答案来自角度来源:)@sirrocco我看到了哇哈哈!那么,我的问题是重复这个问题,还是…?该死,一个黑客。。临时性,但出于非黑客代码的精神和我的用户CPU的利益,我将抵制简化语法的冲动。上帝禁止有人决定在循环中以这种骇人的方式调用依赖项……顺便说一句,在将依赖项注入
MyController
函数之后,MyController
是否将该对象重置为新函数?这将用Angular2进行清理。您将把类型传递给装饰器以解决依赖关系。据我所知,隐式黑客完全消失了。