dsd*_*dsd 6 javascript oop angularjs
我正在寻找伪代码答案或概念性答案.
编程多年后,我从未创建过接收函数参数的类方法,以便方法的调用者自动访问"不可见"属性.
如果我尝试在我的my_app.controller(...)方法之外访问$ scope ,我会收到一个错误,所以我知道它不是全局的; 如果我尝试访问它my_app.$scope或angular.$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)
在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函数的第一个参数,并使用该知识正确调用函数.
| 归档时间: |
|
| 查看次数: |
765 次 |
| 最近记录: |