我在使用各大社区查关于angular的知识的时候,经常看到两种依赖注入的模式,有的是controller.('Ctr',[$scope,function($scope){...}]);有的直接是controller.('Ctr',function($scope){...});想请教一下后面这个是新的模式而且通用的吗?
光阴似箭催人老,日月如移越少年。
最佳实践是用:controller.('Ctr',['$scope',function($scope){...}])。
如@Deboy所说,为了js压缩。
性能更优。(controller.('Ctr',function($scope){...})的写法,angularjs会解析这个function的参数,最终得到要注入的内容,而数组式的写法能跳过解析这一步,性能上会更好)。附上源码供参考:
function annotate(fn, strictDi, name) { var $inject, fnText, argDecl, last; if (typeof fn === 'function') { 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); } fnText = fn.toString().replace(STRIP_COMMENTS, ''); argDecl = fnText.match(FN_ARGS); forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) { arg.replace(FN_ARG, function(all, underscore, name) { $inject.push(name); }); }); } fn.$inject = $inject; } } else if (isArray(fn)) { last = fn.length - 1; assertArgFn(fn[last], 'fn'); $inject = fn.slice(0, last); } else { assertArgFn(fn, 'fn', true); } return $inject; }
因为前端优化的过程中会对js等文件进行压缩等处理,会把一些字符串给替换成单个字母,如果是这样会导致angular注入失败,后面那个是没有做防止压缩后无法注入的处理的 前一个做了这个处理所以即使压缩了也不会导致注入失败
开发阶段两个执行的效果是一样
angular的依赖注入的实现方式,没有什么规范/标准可谈,但却是不错的思路。我之前写过一篇教程,教你手写一个类似angular的依赖注入系统,希望对你有用:BDD手写依赖注入
angular
最佳实践是用:controller.('Ctr',['$scope',function($scope){...}])。
如@Deboy所说,为了js压缩。
性能更优。(controller.('Ctr',function($scope){...})的写法,angularjs会解析这个function的参数,最终得到要注入的内容,而数组式的写法能跳过解析这一步,性能上会更好)。附上源码供参考:
因为前端优化的过程中会对js等文件进行压缩等处理,会把一些字符串给替换成单个字母,如果是这样会导致angular注入失败,后面那个是没有做防止压缩后无法注入的处理的 前一个做了这个处理所以即使压缩了也不会导致注入失败
开发阶段两个执行的效果是一样
angular
的依赖注入的实现方式,没有什么规范/标准可谈,但却是不错的思路。我之前写过一篇教程,教你手写一个类似
angular
的依赖注入系统,希望对你有用:BDD手写依赖注入