理解AngularJS函数$arguments

Understanding AngularJS function $arguments

本文关键字:arguments 函数 AngularJS 理解      更新时间:2023-09-26

从angular.js开始,我看到了一个与回调参数相关的常见模式。一个例子是ui路由器文档:

var myApp = angular.module('myApp', ['ui.router']);
myApp.config(function($stateProvider, $urlRouterProvider) {
    // Do stuff with ui-router providers
}):

但是,根据我所看到的,myApp.config回调的参数可能不同,并且它仍然会像预期的那样运行:

myApp.config(function(OtherProvider) {
    // Do stuff with provider from another service
});

myApp.config如何知道区别?有没有奇怪的魔法内省正在进行,或者有没有一些基本的JS概念允许这样做?例如:

myApp.config = function(callback) {
    var providerNames = callback.argumentNames;
    var providers = this.findProviders(providerNames);
};

也许我太习惯了python,这种功能只有通过一些非常可怕的黑客才能实现。

是Angular使用的一种"可怕的破解",用于一种依赖注入方法,即服务名称自动从参数名称中解析在语言级别上没有对这种操作的内在支持

可以通过函数中的arguments对象访问参数值(但参数名称不是)。然而,参数名称本身只能通过将[[ToString]]应用于函数对象并解析结果1来访问一种"可怕的破解"。

在显式形式中,注入的参数必须按照与提供的依赖项列表相同的顺序出现——在这种情况下,参数的名称无关紧要,因为服务名称是单独提供的。

表格摘录自链接文档,略有修改:

// service names supplied separately
//  - only Order of parameters matters
someModule.controller('MyController',
  ['$scope', 'greeter', function(I_am_a_scope, greeter) { ..
// service names supplied separately
//  - only Order of parameters matters
var MyController = function($scope, GREETER) { ..
MyController.$inject = ['$scope', 'greeter'];
// "scary hack" magic of Angular JS, as service names not specified separately
//  - the Name of the parameters is used as service name
// arguably Too Much Magic (TM), and a source of pain for minification
someModule.controller('MyController', function(greeter, $scope) { ..

前两个表单使用Function.prototype.apply,它类似于Python中的apply()。第三个请求并解析函数的文本表示——一个"可怕的破解"。


1要了解如何实现神奇的形式,请考虑以下内容:

f = function (a,b) { return a+b }
f.toString() // e.g. -> "function (a, b) { return a + b; }"

ECMAScript 5表示Function.prototype.toString返回:

返回函数的与实现相关的表示。此表示具有FunctionDeclaration的语法。特别要注意的是,字符串表示中空格、行终止符和分号的使用和放置取决于实现。

(我不知道有任何现代浏览器不返回"可用"结果;返回表示的行为不是可选的ES5。)

这基本上是javascript的一部分。Javascript在调用函数参数时非常灵活。

例如,您声明了一个函数:

 function abc (first, second) {
 } 

但是当你调用它时,你可以传递任意数量的参数,即使没有零个参数。如果您没有传递一个参数,但在声明函数时已经定义了它,那么您将获得该特定参数的值"undefined",但它不会中断代码执行。

Javascript在函数内部提供了一个名为"arguments"的特殊本地数组(基本上所有东西都是JS中的对象)。我之所以称之为特殊,是因为它是一个只有一个数组属性"长度"的数组,其他数组方法或属性不可用

abc(firs,second,third) 

在abc内部,我们可以检查提供的参数

function abc (first, second) {
  var args_total = arguments.length; 
  var no_of_defined_args = Function.length;
} 

Yes Function.length是另一个属性,您可以通过它检查函数实际定义了多少个参数