You might be interested in the work of Salman Mirghasemi on anonymous function naming in JavaScript: http://johnjbarton.github.com/nonymous/index.html
jjb On Fri, Nov 16, 2012 at 11:34 AM, Aron Homberg <i...@aron-homberg.de> wrote: > I implemented a JS parser last week (in JS) which specially parses the > function grammar. It also analyzes the function names based on the rules > you described, Brandon. I came to the same results when thinking about how > function names could be detected (statically). > > But... there are some special cases where I wasn't able to find a good way > to detect a function's name properly. In one case, thats because my parser > just does a simple static parsing. Due to this, symbols are not evaluated > by toString(), like mentioned. But that's not the end of the story, there > are more pitfalls in practice... > > A) Anonymous FunctionExpression's, stored in an array: > > var someArray = [function() { > // Have > }, function() { > // a > }, function() { > // lot of > }, function() { > // fun > }]; > > e.g. Sencha's Ext JS does this in their Ext.data.Connection class where > it's used to determine which ActiveXObject instance to choose for an > XMLHttpRequest impl. in IE (calls the function in a loop) > > I thought about combine sombol-name with array index, to give them a name. > It would look like: "someArray-0", "someArray-1", etc. but somehow I don't > really like that. Currently they are 'called': "anonymous-" + sequence++ - > I increase this sequence with each anonymous function detected to give > these functions a unique name (in script context). > > B) FunctionExpression's assigned to a symbol: > > var foo = { > barFn: null > }; > > foo[barFn] = function() { > // whatever > }; > > I faced this kind of code when parsing jQuery 1.8.1. It's hard to find a > smart way here. The property name could be a function call too or whatever. > So the name of the function is detected as "symbol-assigned-anonymous-" + > sequence++ here. For sure, function name could be "foo[barFn]" too. Maybe, > thats better for a developer in practice. With static analysis, these both > solutions are all I can do here. But dynamic evaluation of the symbol and > casting to a String, is too much for my static parsing algorithm. > > Imagine stranger situations: > > foo[fetchPropertyName()] = [function() { > // no > }, function() { > // fun > }]; > > Here a static function name detection fails too. A dynamic symbol to > String conversion can be dangerous in such a situation too, right? > > C) Scoped functions: > > (function() { > // what's my name? > }) > > No chance, this one is totally anonymous, right? No matter if static or > dynamic code analysis/parsing. > > ----- > > Now in practice: (parsing jQuery 1.8.1) > > When I parse jQuery 1.8.1 using my parser, 511 functions get parsed and > their names get detected correctly. 137 functions apply to one of the three > special cases above. Most of them are symbol-assigned. Few are scoped by > (). One additional function is being instantiated using "new > Function('$code')". I didn't implemented a name detection for this grammar > yet, so 138 of 511 functions are somehow "anonymous" after detecting > function names using my static parsing algorithm. > > I wonder what your thoughts are regarding these special cases and my > decision to fallback to "symbol-assigned-anonymous-" + sequence++. Would > you prefer using the sourcecode of the symbol assignment as detected > function name name? It would be more descriptive in practice, right? > > @Alex: "The name would be more useful if it could be either string or > symbol" > Please help me out :) The function will be assigned to the symbol, right? > So using the symbol as name would simply be a reference to the function > itself and equals to arguments.callee? Or did you mean the sourcecode of > the symbol as the detected name of the function like I mentioned above? > > Thanks and regards, > - Aron > > > 2012/11/16 Axel Rauschmayer <a...@rauschma.de> > >> Whenever a function's name is defined by a Symbol instead of a regular >> identifier then the name is the result of ToString(symbol). >> >> >> Symbols don't have useful ToString conversions, do they? Are you thinking >> of the optional string passed to the constructor, for diagnostics and >> debugging? >> >> >> The name would be more useful if it could be either string or symbol. Not >> sure about security implications, though. >> >> -- >> Dr. Axel Rauschmayer >> a...@rauschma.de >> >> home: rauschma.de >> twitter: twitter.com/rauschma >> blog: 2ality.com >> >> >> _______________________________________________ >> es-discuss mailing list >> es-discuss@mozilla.org >> https://mail.mozilla.org/listinfo/es-discuss >> >> > > _______________________________________________ > es-discuss mailing list > es-discuss@mozilla.org > https://mail.mozilla.org/listinfo/es-discuss > >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss