猿问

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)?


交互式爱情
浏览 975回答 4
4回答

qq_笑_17

我是这样理解这个问题的。如果按照你的写法,一般意义上来讲,function中传参,参名改成其他的也是可行的。但是你可能忽略了, 你没有按照严格的写法来写这段依赖注入。比如你的示例,完整应该这样写app.controller("ctrl", ['$scope','$rootScope', '$http',function ($scope, $rootScope, $http) {    // do something with $scope, $rootScope, $http}]);也就是说,你函数当中的参数,已经被你的依赖注入,“固定”好了,这也顺便回答了你angularjs是如何判断我传的参数的顺序的。就是通过依赖注入,来确定你的参数顺序的,而这些“实际存在的工作”被你省略了。

DIEA

app.controller("ctrl", ['$scope','$rootScope', '$http',function (fakeScope, fakeRootScope, fakeHttp) {    // do something with $scope, $rootScope, $http}]);这样写名字就可以随便怎么变

大话西游666

这就取决于angular的依赖注入实现了,采用Function.prototype.toString将函数转为string,分析里面的参数名称,执行时将这些服务作为参数传递进来就行了function injector(fakeScope) {}injector.toString()// output: // "function injector(fakeScope) {}"所以,这就是不行的原因了。但是你这样写是有限制的,如果使用了代码混淆,参数名可能变成这样function injector(a) {}所以,正经的写法按照前几位回答的写就行了,injector作为一个array,依赖从array的slice(0, -1)中取。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答