Created
July 23, 2013 15:38
-
-
Save flakd/6063395 to your computer and use it in GitHub Desktop.
JS - angular.js - get function parameter names dynamically
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Below is the code taken from AngularJS which uses the technique for its dependency injection mechanism. | |
| And here is an explanation of it taken from http://docs.angularjs.org/tutorial/step_05 | |
| Angular's dependency injector provides services to your controller when the controller is being constructed. The dependency injector also takes care of creating any transitive dependencies the service may have (services often depend upon other services). | |
| Note that the names of arguments are significant, because the injector uses these to look up the dependencies. | |
| /** | |
| * @ngdoc overview | |
| * @name AUTO | |
| * @description | |
| * | |
| * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}. | |
| */ | |
| var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m; | |
| var FN_ARG_SPLIT = /,/; | |
| var FN_ARG = /^\s*(_?)(.+?)\1\s*$/; | |
| var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg; | |
| function annotate(fn) { | |
| var $inject, | |
| fnText, | |
| argDecl, | |
| last; | |
| if (typeof fn == 'function') { | |
| if (!($inject = fn.$inject)) { | |
| $inject = []; | |
| 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; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment