Personally I'm already slightly weirded by the static behaviour - doing this dynamically would result in cases where a function which is otherwise anonymous would happen to claim the first name of many that it's assigned to throughout its lifetime. This would actually be observable at runtime as `name` changing. Or maybe I'm overlooking something.<div><br></div><div>Better IMO is if the stack trace would always include the name of the function *as it was called*, in addition to the function's own `name`, assuming its presence. That, assuming thoughtfully named variables, might give a little extra immediate insight into the call stack. Obviously if the function call had no name, i.e. it was an arbitrary expression, we'd have to skip this.<br><br>Alex</div><div><br>On Thursday, September 17, 2015, Axel Rauschmayer <<a href="mailto:rauschma@icloud.com">rauschma@icloud.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><blockquote type="cite"><div><div style="word-wrap:break-word">Not quite, the mechanism which does this in the spec is SetFunctionName (<a href="http://www.ecma-international.org/ecma-262/6.0/#sec-setfunctionname" target="_blank">http://www.ecma-international.org/ecma-262/6.0/#sec-setfunctionname</a>), and it only works for specific syntactic constructs (eg, `foo = function() {}` -> anonymous function is named “foo”, let x = () => {} -> anonymous arrow is named “x”, etc).<div><br></div><div>It does not apply to things like `compose(thingA, thingB)`, which is not an anonymous function definition.These function names aren’t set at runtime, it’s a parse-time operation, and depends on the productions that are parsed.</div></div></div></blockquote><div><br></div></div><div>Ah, fascinating! That’s something that I overlooked. It is an odd mix of static and dynamic, though.</div><div><br></div><div>For example: <a href="http://www.ecma-international.org/ecma-262/6.0/#sec-assignment-operators-runtime-semantics-evaluation" target="_blank">http://www.ecma-international.org/ecma-262/6.0/#sec-assignment-operators-runtime-semantics-evaluation</a></div><div><br></div><div>My understanding:</div><div><br></div><div>– The actions themselves happen at runtime, not at compile time.</div><div>– (1.e) IsAnonymousFunctionDefinition() is a static check that only holds if AssignmentExpression is an anonymous function expression (syntactically).</div><div>– (1.e.i) is a dynamic check, SetFunctionName() happens dynamically, too.</div><div><br></div><div>Wouldn’t it make sense to turn IsAnonymousFunctionDefinition() into a dynamic check, too? A check whether _rval_ is a function should suffice (given the check whether property `name` exists, later).</div><br>
<div><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word"><div style="word-wrap:break-word">-- <br>Dr. Axel Rauschmayer<br><a href="javascript:_e(%7B%7D,'cvml','axel@rauschma.de');" target="_blank">axel@rauschma.de</a><br><a href="http://rauschma.de" target="_blank">rauschma.de</a></div><div><br></div></div></div></div></div></div></div></blockquote></div>