angular的控制器方法如何使$ scope可用于我的函数参数

dsd*_*dsd 6 javascript oop angularjs

我正在寻找伪代码答案或概念性答案.


编程多年后,我从未创建过接收函数参数的类方法,以便方法的调用者自动访问"不可见"属性.

如果我尝试在我的my_app.controller(...)方法之外访问$ scope ,我会收到一个错误,所以我知道它不是全局的; 如果我尝试访问它my_app.$scopeangular.$scope我得到未定义.

那么我的函数参数如何访问它:

    my_app.controller('my_controller' , function( $scope , ... ) { ... }
Run Code Online (Sandbox Code Playgroud)

更新(正如我所知):

  // javascript
  var my_class =   function( argument_A )                 
                       { this.some_prop = argument_A ;        

                         this.some_method = function( argument_B ) 
                           { console.log( argument_B ) ; // function(boo)
                           } ;
                       } ;

  var my_instance = new my_class( "my_string" ) ;

  var my_function_argument = function( boo ){ } ;
  my_instance.some_method( my_function_argument ) ; 
Run Code Online (Sandbox Code Playgroud)

geo*_*awg 5

职能是一等公民

在JavaScript和其他现代语言(Scala,Haskell,LISP等)中,函数被视为一等公民.具体来说,这意味着该语言支持将函数作为参数传递给其他函数,将它们作为其他函数的值返回,并将它们分配给变量或将它们存储在数据结构中.一些编程语言理论家也需要支持匿名函数(函数文字).在具有一等函数的语言中,函数名称没有任何特殊状态; 它们被视为具有函数类型的普通变量.1

以上示例可以重新考虑为:

var myController = function ($scope, ... ) {
     console.log($scope);
     $scope.message = "Hello world"
};

my_app.controller('my_controller' , myController );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,该.controller方法将myController对象存储在AngularJS $controllerProvider服务的缓存中.即cache["my_controller"] = myController;

稍后当$compile服务遇到需要控制器的指令时:

<div ng-controller="my_controller">
    {{message}}
</div>
Run Code Online (Sandbox Code Playgroud)

$compile服务创建一个新范围,myController$controller服务缓存中检索该函数,并使用新范围作为该函数的第一个参数调用该函数.

$compile服务还会创建一个$watch跟踪$scope.message变量的监听功能.在每个摘要周期中,如果$scope.message已更改,则会相应地更新DOM.

在问题的例子中:

//These are function invocations, the variable must be defined

console.log( boo )              ; //    ERROR: boo is not defined
my_instance.some_method( boo )  ; //    ERROR: boo is not defined
Run Code Online (Sandbox Code Playgroud)

最后一个表单使用匿名函数文字(或函数表达式).匿名函数是作为参数传递给名为的方法的对象 .some_method.

//The anonymous function is an object passed as an argument
//boo is a parameter to be supplied when the function is invoked

my_instance.some_method( function( boo ) { } ) ; // NO ERROR
Run Code Online (Sandbox Code Playgroud)

有关函数文字的更多信息,请参阅MDN JavaScript Reference - 函数表达式.


依赖注入和按名称连接参数

通常在JavaScript中,函数参数按位置连接.在AngularJS框架中,函数参数按名称注入.怎么做的?

来自Docs:

推理

在JavaScript中调用toString()函数返回函数定义.然后可以解析定义并提取函数参数.

- AngularJS $ injector服务API参考 - 推理

所以在这个例子中:

my_app.controller('my_controller' , function( $scope , ... ) { ... }
Run Code Online (Sandbox Code Playgroud)

$injector服务toString()对控制器构造函数执行操作并对其进行解析.该服务检测到该$scope函数的第一个参数,并使用该知识正确调用函数.

您可以在源代码中看到此处fn.toString()使用.