Brandon Benvie wrote:
This is based on
http://wiki.ecmascript.org/doku.php?id=strawman:name_property_of_functions
Justification: the usefulness of the name of function is not just for
debugging. It is useful in the same ways that property names as
strings are such as dispatching by name or assigning by name.
The goals expand a bit beyond the ones in the strawman, and are also
updated based on the current state of affairs. The first goal is that
every function has an own "name" property, and this property is always
a string (unless the user specifically decides to violate this norm),
and that this name property is initialized with the value that makes
sense from static semantics.The third goal is to allow predefined
names to be altered in cases where it makes sense.
The third goal needs more discussion. The displayName property consulted
by certain devtools (WebKit JS profiler, IIRC; others by now) was added
to avoid non-writable .name. With downrev browsers in the field, how can
we make name writable and let it be used cross-browser that way?
Semantics:
The baseline for every function is the 'name' property defined as
{ value: "",
writable: true,
enumerable: false,
configurable: false }.
SpiderMonkey's .name property of functions is like this except for
writable: false.
For FunctionDeclarations, named FunctionExpressions,
MethodDefinitions, or accessor Properties then the function's "name"
property is set to the given identifier.
Nit: don't define a baseline and then mutate it. Better to have the
write immutable pd from the get-go, for each case.
In the case of the constructor method of classes, the class name is
used instead. In the case of accessors, 'get ' or 'set ' is included.
at the front, to be super-clear ;-).
The "name" property is set to non-writable. Function.prototype's name
is also non-writable.
Oh, I see now: you made .name writable only as a spec-internal thing.
But wait, what about your goal 3?
Anonymous FunctionExpressions and ArrowFunctionExpressions assigned in
a VariableDeclaration or ObjectExpression
"defined in an ObjectLiteral", rather.
are given the name of the variable or property they are assigned to
and the name remains writable. Anonymous ClassExpressions follow the
same semantics, with the name being used for the constructor method.
Really great stuff here, this makes me want to back your proposal. Just
need to hash out the nits and points of confusion (possibly mine).
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 property should (probably) not have any reflection on the
output of Function.prototype.toString.
You mean if f.name is writable then f.toString() should not reflect
updates to f.name? Agreed, but why is f.name writable?
/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss