为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

交互式爱情 2019-02-26 21:18:39
请教一个问题:在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)?
查看完整描述

4 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

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


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


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


app.controller("ctrl", ['$scope','$rootScope', '$http',function ($scope, $rootScope, $http) {

    // do something with $scope, $rootScope, $http

}]);

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


查看完整回答
反对 回复 2019-03-14
?
DIEA

TA贡献1820条经验 获得超2个赞

app.controller("ctrl", ['$scope','$rootScope', '$http',function (fakeScope, fakeRootScope, fakeHttp) {

    // do something with $scope, $rootScope, $http

}]);

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


查看完整回答
反对 回复 2019-03-14
?
大话西游666

TA贡献1817条经验 获得超14个赞

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


function injector(fakeScope) {}

injector.toString()

// output: 

// "function injector(fakeScope) {}"

所以,这就是不行的原因了。

但是你这样写是有限制的,如果使用了代码混淆,参数名可能变成这样


function injector(a) {}

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


查看完整回答
反对 回复 2019-03-14
  • 4 回答
  • 0 关注
  • 974 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信