将函数传递给各种AngularJS方法的推荐方法是使用在AngularJS文档中称为数组符号的语法。
你应该做这个:
app.controller("MyCtrl", ['$scope', function($scope){
$scope.someData = "Array notation";
}]);
代替这个:
app.controller("MyCtrl", function($scope){
$scope.someData = "non-array notation";
});
由于AngularJS依赖项注入和缩小的工作方式。
我想知道将函数作为参数传递的第一种方法是否是JavaScript标准中提到的语法?在这种情况下,我没有设法在网络上找到任何有关“数组符号”的信息。
最佳答案
这只是一个约定-但经过深思熟虑,因此已在整个Angular中使用。可见,一个函数-一个模块-可以只有一个依赖项(如您的示例),也可以具有多个依赖项(从两个开始,对),或者完全没有依赖项。因此,我们需要一些可以解决所有情况的解决方案。
天真的方法是将所有dep指定为函数参数(第二个示例)。现在,可以通过分析函数源代码来提取(并注入)它们。专业版:绝对的最小代码要写(无论如何,您都必须指定所有部门的名称)。缺点:1)基于反射(永远不会很快),2)在脚本最小化(并且所有参数的名称都已转换)时中断。
这些缺点已经很糟糕了,因此必须另辟way径。不过,我们不想摆脱参数列表(那些dep仍必须以某种方式在函数中解决,对吗?)。但是现在很明显,单单是不够的-必须在某个地方重复。
这就是Array(元素的有序序列)非常方便的地方。现在,注入器仅需分离该数组的最后一个元素即可获得完整的deps列表。这些是字符串,不是变量,因此不会被minifier修改。更好的是,现在我们不必分析签名,因此注入器的工作速度更快。
从理论到实践:这是在Angular 1.x DI模块中实现这两种方法的方式:
function annotate(fn, strictDi, name) {
var $inject,
fnText,
argDecl,
last;
if (typeof fn === 'function') {
// first approach: only function is passed, we need to analyze the args list
if (!($inject = fn.$inject)) {
$inject = [];
if (fn.length) {
if (strictDi) {
if (!isString(name) || !name) {
name = fn.name || anonFn(fn);
}
throw $injectorMinErr('strictdi',
'{0} is not using explicit annotation and cannot be invoked in strict mode', name);
}
// get rid of comments, it's possible to have those inside `()`
fnText = fn.toString().replace(STRIP_COMMENTS, '');
// extract arguments
argDecl = fnText.match(FN_ARGS);
// push those into injector
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
arg.replace(FN_ARG, function(all, underscore, name) {
$inject.push(name);
});
});
// ... and that took some time
}
fn.$inject = $inject;
}
} else if (isArray(fn)) {
// second approach: an array is passed
last = fn.length - 1;
// make sure its last element is a function
assertArgFn(fn[last], 'fn');
// use all but the last element as list of deps
$inject = fn.slice(0, last);
// ... and that's all, believe it or not!
} else {
assertArgFn(fn, 'fn', true);
}
return $inject;
}
如您所见,第一个
if
分支用于旧方法-将deps表示为函数参数。第二个(更易于阅读和执行)-用于将deps和函数放置在数组中(函数是最后一个元素)。关于javascript - 将函数作为参数传递-数组表示法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32424844/