angularjs里$scope,$rootScope等名字为什么不能变?

请教一个问题:

angularjs里我们常常会写这样的代码

app.controller("ctrl", function ($scope, $rootScope, $http) {
    // do something with $scope, $rootScope, $http
});

但是为什么$scope$http等的名字是不能变的呢?就是说为什么我不能写成这个样子:

app.controller("ctrl", function ($fakeScope, $fakeRootScope, $fakeHttp) {
    // do something with $fakeScope, $fakeRootScope, $fakeHttp
});

甚至是这样:

app.controller("ctrl", function (fakeScope, fakeRootScope, fakeHttp) {
    // do something with fakeScope, fakeRootScope, fakeHttp
});

都是不行的。

以及,angularjs是如何判断我传的参数的顺序的(比如为什么我传的第一个就是$scope而不是$rootScope)?

阅读 3.6k
6 个回答

我是这样理解这个问题的。

如果按照你的写法,一般意义上来讲,function中传参,参名改成其他的也是可行的。

但是你可能忽略了, 你没有按照严格的写法来写这段依赖注入。比如你的示例,完整应该这样写

app.controller("ctrl", ['$scope','$rootScope', '$http',function ($scope, $rootScope, $http) {
    // do something with $scope, $rootScope, $http
}]);

也就是说,你函数当中的参数,已经被你的依赖注入,“固定”好了,这也顺便回答了你angularjs是如何判断我传的参数的顺序的。就是通过依赖注入,来确定你的参数顺序的,而这些“实际存在的工作”被你省略了。

app.controller("ctrl", ['$scope','$rootScope', '$http',function (fakeScope, fakeRootScope, fakeHttp) {
    // do something with $scope, $rootScope, $http
}]);

这样写名字就可以随便怎么变

天生如此。

你没有使用依赖注入

这就取决于angular的依赖注入实现了,采用Function.prototype.toString将函数转为string,分析里面的参数名称,执行时将这些服务作为参数传递进来就行了

function injector(fakeScope) {}
injector.toString()
// output: 
// "function injector(fakeScope) {}"

所以,这就是不行的原因了。
但是你这样写是有限制的,如果使用了代码混淆,参数名可能变成这样

function injector(a) {}

所以,正经的写法按照前几位回答的写就行了,injector作为一个array,依赖从array的slice(0, -1)中取。

框架内置的,为何在使用时 你再起个名字?出于什么目的呢。。完全没道理啊!!
依赖注入,从ng1.x就有,有空你再用用ng2.x 就更能体会依赖注入的特性。
至于依赖注入时,注入的参数顺序问题,我个人认为这个和JS里的arguments特性很类似,可以再去看看arguments相关的内容,这样就比较好理解。使用时也不会太纠结;个人在使用NG1的时候依赖注入($scope$http$filter以及自定义的vlaueservice等)时并没有可以去关注传参顺序,通过gulp等压缩混淆后也没有任何问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题