我正在寻找伪代码答案或概念性答案。
编程多年后,我从未创建过接收函数参数的类方法,以便方法的调用者自动访问“不可见”'属性。
如果我尝试在我的my_app.controller(...)
方法之外访问$ scope,我会收到错误,所以我知道它不是全局的;如果我尝试从my_app.$scope
或angular.$scope
访问它,我会得到未定义。
那么我的函数参数如何访问它:
my_app.controller('my_controller' , function( $scope , ... ) { ... }
更新(正如我所知):
// 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 ) ;
答案 0 :(得分:5)
在JavaScript和其他现代语言(Scala,Haskell,LISP等)中,函数被视为一等公民。具体来说,这意味着该语言支持将函数作为参数传递给其他函数,将它们作为其他函数的值返回,并将它们分配给变量或将它们存储在数据结构中。一些编程语言理论家也需要支持匿名函数(函数文字)。在具有一等函数的语言中,函数名称没有任何特殊状态;它们被视为具有函数类型的普通变量。 1
以上示例可以重新计算为:
var myController = function ($scope, ... ) {
console.log($scope);
$scope.message = "Hello world"
};
my_app.controller('my_controller' , myController );
在这种情况下,.controller
方法将myController
对象存储在AngularJS $controllerProvider
服务的缓存中。即cache["my_controller"] = myController;
稍后当$compile
服务遇到需要控制器的指令时:
<div ng-controller="my_controller">
{{message}}
</div>
$compile
服务创建一个新范围,从myController
服务缓存中检索$controller
函数,并使用新范围作为函数的第一个参数调用该函数。 / p>
$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
最后一个表单使用匿名函数文字(或函数表达式)。匿名函数是作为参数传递给名为.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
有关函数文字的更多信息,请参阅MDN JavaScript Reference -- function expression。
通常在JavaScript中,函数参数按位置连接。在AngularJS框架中,函数参数按名称注入。怎么做的?
来自文档:
推断
在JavaScript中调用函数
toString()
返回函数定义。然后可以解析定义并提取函数参数。
- AngularJS $injector Service API Reference -- Inference
所以在示例中:
my_app.controller('my_controller' , function( $scope , ... ) { ... }
$injector
服务在控制器构造函数上执行toString()
并解析它。该服务检测到$scope
是函数的第一个参数,并使用该知识正确调用函数。
您可以看到fn.toString()
正在使用here in the source code。
答案 1 :(得分:0)
在创建函数并在函数参数中传递dependency
名称时,在这种情况下,angular会通过从其DI容器中解析该依赖项来为每个依赖项创建一个对象。这种依赖注入技术称为constructor function
(还有两种DI技术)。
当您使用ng-controller
指令在DOM上注入控制器时,函数将传递给$controllerProvider
的{{3}}函数。控制器功能称为工厂功能。哪个将作为参数以依赖项传递。 $injector
服务从函数中获取每个依赖项,并执行$injector.get
以返回在DI容器中注册的依赖项。在返回$scope
依赖关系时,它会使用scope
方法从rootScope
创建新的$rootScope.$new(isolate, parent)
。 $new
方法将两个参数1st 1st视为bool
&amp;第二个作为parentScope
参数。其他依赖关系直接从寄存器组件取出到模块。