理解AngularJS函数$arguments
Understanding AngularJS function $arguments
从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是另一个属性,您可以通过它检查函数实际定义了多少个参数
- 创建一个类似链接的按钮,并通过Javascript函数打开一个新的弹出窗口
- 将函数的上下文应用于javascript变量
- 如何在JavaScript中将字符串转换为函数引用
- 用嵌套函数和默认函数定义函数
- 使用 jQuery 的 .on 函数如何获取事件的原始元素
- 无法导出函数expressjs/requestjs中的变量
- 函数参数中的数据与指定变量之间的任何性能差异
- JQuery合并了keyup和focusout两个函数
- ES6构造函数返回基类的实例
- 监视函数从服务返回不起作用,但作用域函数起作用
- 我可以在json对象中添加一个函数吗
- AngularJS:我可以跳过函数参数回调吗
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- JavaScript数组排序(函数)用于对表行进行排序,而不是排序
- 理解AngularJS函数$arguments
- 替换新函数中的 arguments.callee
- JS:.apply(null,arguments)——为什么我的函数被调用一次,而console.log被调用多次
- 函数 (){ 返回 fn.apply(me, arguments); } 作为回调
- JavaScript:为什么我们在函数中使用 **arguments** 对象
- 无法获取函数调用者名称(arguments.callee).呼叫者不工作)