Angularjs 在DI集合之后,匿名函数中的局部变量是怎样的?

Angularjs 在DI集合之后,匿名函数中的局部变量是怎样的?,angularjs,Angularjs,我已经尽可能多地阅读了教程和Angular文档,但对于幕后发生的事情,我仍然有一些问题。我想我的主要问题是关于依赖注入。。。在数组的第一个参数中声明它们时,是否调用了服务?这些值是如何传递给匿名函数的 例如: 这就是我的价值观: angular.module("root", []) .value("message", "Hello world!"); 这是我的控制器: angular.module("root&quo

我已经尽可能多地阅读了教程和Angular文档,但对于幕后发生的事情,我仍然有一些问题。我想我的主要问题是关于依赖注入。。。在数组的第一个参数中声明它们时,是否调用了服务?这些值是如何传递给匿名函数的

例如:

这就是我的价值观:

angular.module("root", [])
    .value("message", "Hello world!");
这是我的控制器:

angular.module("root", [])
    .controller("index", ["$scope", "message", function($scope, message) {
        // Do something with message and/or $scope.
    }]);
所以我的问题是:

  • 当我们在数组的第一个参数的索引控制器中声明依赖项注入时。。。发生了什么事?我知道:
  • 负责使用我们通过$PROFERE提供的代码(无意使用双关语)实际创建我们服务的实例。每当您编写一个接受注入参数的函数时,您都会看到注入器在工作

    一旦拥有$injector,就可以通过使用服务名称对其调用get来获取已定义服务的实例

    以下是我感到困惑的一句话:

    注入器还负责将服务注入函数中;例如,您可以使用注入器的invoke方法将服务神奇地注入到您拥有的任何函数中

    将服务注入函数在幕后意味着什么?当我们在数组中声明字符串时是否调用了某个函数,返回值是否设置为匿名函数中局部变量的值如何设置消息集?

    function($scope, message) {...
    
    这是另一个例子。 因此,该工厂取决于因子值:

    angular.module("services", [])
        .value("factor", 6)
        .factory("square", ["factor", function (factor) {
                return factor * factor;
        }]);
    
    此控制器依赖于$scope和square服务:

    angular.module("root", ["services"])
        .controller("index", ["$scope", "square",
            function ($scope, square) {
                $scope.product = square;
            }
        ]);
    
    但是匿名函数集中的局部变量是如何设置的?

    function($scope, message) {...
    
    问题:

    注意:我已经读过了:


    回答您的问题:'但是匿名函数集中的局部变量是如何设置的?':它们不是,而是作为参数提供的。它们被“注入”到函数中

    看看这个例子:

    inject = function(first, second, target) {
        return target(first, second);
    }
    
    greeter = function(name, age) {
        var name = name;
        var age = age;
        return {
            sayHi : function() {
                console.log('Hi there ' + name + ' you are ' + age);
            }
        }
    }
    
    var johngreeter = inject('john',22,greeter);
    johngreeter.sayHi(); // Hi there john you are 22
    var janegreeter = inject('jane',30,greeter);
    janegreeter.sayHi(); // Hi there jane you are 30
    
    你可以在这里玩:

    我希望你能看到你的角度代码的相似之处。
    .controller
    函数有一个名称(第一个参数),然后是一个参数数组,然后是实际的控制器函数(第二个参数)

    “$scope”,“square”
    将被注入该数组第三部分中函数的
    $scope,square
    参数中。因此,我怀疑您所谓的“局部变量”$scope是由注入器设置为函数参数的


    角度注入器显然要复杂得多,它将尝试通过名称或其他约定来解析
    $scope
    square
    ,但我希望您明白这一点:它注入函数的参数(因此是一个好名称)。

    这都在函数的官方文档中进行了解释。依赖项注入不是JavaScript回调。在阅读了文档之后,你能把这个问题缩小到一个问题吗?我投票结束这个问题,因为阅读手册很容易回答问题。我读了手册,还是不明白。你能提供一个答案吗?你写道:“$scope”,“square”将被注入该数组第三部分中函数的$scope,square参数中。因此,我怀疑你所谓的‘局部变量’$scope是由注入器设置为函数参数的。”所以变量由注入器设置,然后用作参数来调用匿名函数?是吗?真的!我想你明白了-注意,角度注入器更智能,它可能有一个内部字典,也能够做更智能的事情-比如为特定的控制器生成一个
    $scope
    。明白了,控制器的scope可能在幕后有一些新的rootscope。因此,一些获取和设置确实是在幕后进行的。现在我可以看出我写的是错误的:“‘但是匿名函数集中的局部变量是怎样的?’:它们不是,它们是作为参数提供的。”。它们被称为参数,而不是set。等等,所有控制器共享一个根作用域,但有自己的作用域。控制器可以嵌套,因此作用域可以嵌套。但它们都共享相同的根范围。这允许不嵌套的控制器进行通信。