Javascript angularjs,$scope参数在幕后是如何工作的?
控制器将匿名函数作为第二个参数 我有两个控制器示例,一个是匿名函数,参数为nothing,第二个是Javascript angularjs,$scope参数在幕后是如何工作的?,javascript,angularjs,Javascript,Angularjs,控制器将匿名函数作为第二个参数 我有两个控制器示例,一个是匿名函数,参数为nothing,第二个是$scope对象 angularjs“幕后”如何检测我的匿名函数是否有参数?我如何在自定义js方法中模拟它 controller('ctrl',function(){ console.log( arguments[0] ); // ->> undefined }); vs 我认为一个伪代码是这样的: ( if F has parameters ) F.bind(
$scope
对象
angularjs“幕后”如何检测我的匿名函数是否有参数?我如何在自定义js方法中模拟它
controller('ctrl',function(){
console.log( arguments[0] ); // ->> undefined
});
vs
我认为一个伪代码是这样的:
( if F has parameters ) F.bind($scope) // or F.call(....)
有案可查
Angular将使用指定的
控制器的构造函数。将创建一个新的子作用域
并作为可注入参数提供给控制器的
构造函数的函数为$scope
因此,传递给控制器构造函数的第一个参数是子作用域实例$scope。
由于
arguments
对象是与传递给函数的参数相对应的类似数组的对象,因此打印arguments[0]将打印第一个传递的参数(即$scope)。angular的依赖项注入是如何工作的:它查看参数名,然后查找它以知道注入什么
您可以在此处找到此项的特定代码:
Angular从三个位置之一获取要注入的对象的名称(仅使用存在的第一个位置):
- 函数的
属性$inject
- 如果您给它一个数组而不是一个函数,那么该函数应该是数组的最后一个元素,并且可注入名称是所有其他元素
- 否则,它将通过调用函数上的
并从中提取名称来检查函数实际期望的参数toString()
$scope
对象传递给每个控制器的注入器,但是您可以使用的大多数其他名称(例如服务)都是单例,并且每次都重复使用相同的对象
您可以自己使用喷油器:
var injector = angular.injector();
function MyFunction(something) { ... }
injector.invoke(MyFunction, this, { something: anObject });
请参见$injector不清楚您的要求。如果没有提供参数,为什么要定义
参数[0]
?这就是angular的依赖项注入的工作原理,请看下面的代码:@charlietfl不要告诉我$scope是angular对象之外的全局变量,是吗?参数
关键字与AngularJS无关。正如您所见,它是JS“core”的一部分。@charlietfl对于大多数注入值都是正确的,$scope
是一个本地值。但这并不能回答问题。问题是Angular如何知道它必须注入$scope
(或其他相关内容)。
var injector = angular.injector();
function MyFunction(something) { ... }
injector.invoke(MyFunction, this, { something: anObject });