Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angularjs,$scope参数在幕后是如何工作的?_Javascript_Angularjs - Fatal编程技术网

Javascript angularjs,$scope参数在幕后是如何工作的?

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(

控制器将匿名函数作为第二个参数

我有两个控制器示例,一个是匿名函数,参数为nothing,第二个是
$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 });