<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:Helvetica;
        panose-1:2 11 6 4 2 2 2 2 2 4;}
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Consolas;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
code
        {mso-style-priority:99;
        font-family:"Courier New";}
pre
        {mso-style-priority:99;
        mso-style-link:"HTML Preformatted Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:10.0pt;
        font-family:"Courier New";}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.msonormal0, li.msonormal0, div.msonormal0
        {mso-style-name:msonormal;
        mso-margin-top-alt:auto;
        margin-right:0in;
        mso-margin-bottom-alt:auto;
        margin-left:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.HTMLPreformattedChar
        {mso-style-name:"HTML Preformatted Char";
        mso-style-priority:99;
        mso-style-link:"HTML Preformatted";
        font-family:Consolas;}
span.EmailStyle22
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">> `Object.keys({ y })[0]` will give you the string `y`, and will survive refactoring tools<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">No it won’t. Given the following:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal">let foo /*1*/ = 1;<o:p></o:p></p>
<p class="MsoNormal">let x = { foo /*2*/ };<o:p></o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In VSCode, if you rename ‘foo’ to ‘bar’ at /*1*/, you get this:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal">let bar = 1;<o:p></o:p></p>
<p class="MsoNormal">let x = { foo: bar };<o:p></o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">If you rename ‘foo’ to ‘bar’ at /*2*/, you get this:<o:p></o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal">let foo = 1;<o:p></o:p></p>
<p class="MsoNormal">let x = { bar: foo };<o:p></o:p></p>
<p class="MsoNormal">```<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Rename only renames one side of the symbol, either the property name or the captured binding, but not both.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><b>From:</b> es-discuss <es-discuss-bounces@mozilla.org> <b>
On Behalf Of </b>Jordan Harband<br>
<b>Sent:</b> Sunday, June 16, 2019 10:35 PM<br>
<b>To:</b> Frederick Stark <coagmano@gmail.com><br>
<b>Cc:</b> es-discuss@mozilla.org<br>
<b>Subject:</b> Re: Re: What do you think about a C# 6 like nameof() expression for<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">again, `Object.keys({ y })[0]` will give you the string `y`, and will survive refactoring tools. you can even do `function nameof(obj) { return Object.keys(obj)[0]; }` and then `nameof({ y })`.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Obviously it's slightly less ergonomic than `nameof y` would be - but adding new syntax is very expensive, so there'd need to be overwhelming evidence that this pattern is commonly used enough, and that userland workarounds like my `nameof`
 function were insufficient.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Sun, Jun 16, 2019 at 10:13 PM Frederick Stark <<a href="mailto:coagmano@gmail.com">coagmano@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> <span style="font-family:"Helvetica",sans-serif;color:#231F20">
> </span><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">your examples are all completely incorrect anyway</span><o:p></o:p></p>
</div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">> "incorrect" as to precisely what? </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">Keep reading the email mate.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">Incorrect as to your understanding of how the language works and at what point variables are defined.</span><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">> <span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">
The user MUST _already_ know the _exact_ identifier name</span><o:p></o:p></p>
</div>
</div>
<div>
<p class="MsoNormal">It's not an issue to need to know the name of the identifier. In fact, as you correctly pointed out, it's necessary.
<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">If I'm understanding it correctly, the value of the proposal is to make it easier to refactor (especially with variable renaming tools) without leaving behind string literals that no longer match the variable name.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">I've run into this issue before, but it's been a relatively minor pain for me personally. So I can see some use for the proposal, though I suspect it would see most of it's use in tooling.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">On the other hand, it might add unnecessary complexity to the language, which should be avoided.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Overall I'm very mildly supportive.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">> <span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">
That leaves the use case of getting ALL of the names of the identifiers in the current scope </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">I have not seen anyone proposing this, so there's no reason to criticize it yet.</span><o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:7.5pt">Obligatory disclaimer: not a TC39 member, no decision making power or influence on process</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">On Jun 17 2019, at 2:42 pm, guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank">guest271314@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">The user MUST _already_ know the _exact_ identifier name or an error will be thrown for the original proposal and additional use case for ```nameof```</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<pre style="background-color:rgba(0,0,0,0.0470588)"><code><span style="color:#333333">const x = nameof y; // "y"</span></code><span style="color:#333333"><br><code>const y = 1;</code></span><o:p></o:p></pre>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">making the need for ```nameof``` moot given that the user cannot then rationally state that the identifier as a _string_ will somehow be mispelled if they are
 able to write the _exact_ name of the identifer at ```nameof``` 100% of the time.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">That leaves the use case of getting ALL of the names of the identifiers in the current scope </span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<pre style="background-color:rgba(0,0,0,0.0470588)"><code><span style="color:#333333">// NAMEOF is always dynamic list of let, const declarations in current scope </span></code><span style="color:#333333"><br><code>console.log(NAMEOF); // ["x", "y"]; [{name:"x", line:5}, {name:"y", line:7}] </code><br><code>// should resolve be in the list even if not declared using const or let?</code><br><code>await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 1000))); </code><br><code>const x = nameof y</code><br><code>await new Promise(resolve => setTimeout(resolve, Math.floor(Math.random() * 1000)));</code><br><code>const y = 1;</code></span><o:p></o:p></pre>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">without having to already know the name of the identifiers, as is required by the original proposal, which essentially negates itself as the string literal
 ```'y'``` is briefer than ```nameof y```.</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On Mon, Jun 17, 2019 at 4:19 AM Frederick Stark <<a href="mailto:coagmano@gmail.com" target="_blank" title="mailto:coagmano@gmail.com">coagmano@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal"><span style="font-size:10.0pt;font-family:"Helvetica",sans-serif;color:#231F20">guest271314, your examples are all completely incorrect anyway since all variable declarations (including let and const) are hoisted to the top of the scope,
 so when </span><code><span style="font-size:10.0pt">nameof y</span></code> is evaluated,
<code><span style="font-size:10.0pt">y</span></code> is already declared in the scope.<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">The special behaviour introduced with <code><span style="font-size:10.0pt">let</span></code> and
<code><span style="font-size:10.0pt">const</span></code> is that they set up a "Temporal Dead Zone" where attempts to set or get their value before the line where they are declared in code throws an exception.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Since <code><span style="font-size:10.0pt">nameof</span></code> doesn't care about the value, only the name of the variable, it would not
<em><span style="font-family:"Calibri",sans-serif">need</span></em> to throw an exception.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Of course, were this proposal to be taken seriously, it could be specced either way<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Jun 17 2019, at 10:15 am, guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<div>
<div>
<p class="MsoNormal">> - If `y` is directly visible in scope and is neither a parameter or<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">destructured binding, `nameof y` should just evaluate to `"y"`. This<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">should be agnostic to whether the binding has been declared yet, so in<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">your example, `x` should be set to `"y"`.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">The 1st question at <a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fesdiscuss.org%2Ftopic%2Fwhat-do-you-think-about-a-c-6-like-nameof-expression-for%23content-33&data=02%7C01%7Cron.buckton%40microsoft.com%7Ccbc2c8f5e9614533e30e08d6f2e594ef%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636963465244030598&sdata=0jx0f3hXTqN3gfvuWWDh1BiuomZfI3eDdGXetyWSOtk%3D&reserved=0" target="_blank" title="https://esdiscuss.org/topic/what-do-you-think-about-a-c-6-like-nameof-expression-for#content-33">
https://esdiscuss.org/topic/what-do-you-think-about-a-c-6-like-nameof-expression-for#content-33</a> remains: <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Without having composed or previously read the source code, at line 1 adjacent to ```nameof``` how does the user know that there will be later declared variable named ```y```?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<div>
<p class="MsoNormal">On Sun, Jun 16, 2019 at 7:04 AM Isiah Meadows <<a href="mailto:isiahmeadows@gmail.com" target="_blank" title="mailto:isiahmeadows@gmail.com">isiahmeadows@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">Here's my opinion:<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">- If `y` is directly visible in scope and is neither a parameter or<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">destructured binding, `nameof y` should just evaluate to `"y"`. This<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">should be agnostic to whether the binding has been declared yet, so in<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">your example, `x` should be set to `"y"`.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">- If `y` is entirely undeclared, it should be a runtime<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">`ReferenceError` in the same way it is when accessing undefined<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">globals. So in your second example, I'd expect it to throw before even<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">attempting assignment<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">-----<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">Isiah Meadows<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="mailto:contact@isiahmeadows.com" target="_blank" title="mailto:contact@isiahmeadows.com">contact@isiahmeadows.com</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="https://nam06.safelinks.protection.outlook.com/?url=http%3A%2F%2Fwww.isiahmeadows.com&data=02%7C01%7Cron.buckton%40microsoft.com%7Ccbc2c8f5e9614533e30e08d6f2e594ef%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636963465244040592&sdata=ncNlzUB9%2FRJmg7%2Bt1vAM4UtxeAMm62ditqH%2BJh2f2kQ%3D&reserved=0" target="_blank" title="http://www.isiahmeadows.com">www.isiahmeadows.com</a><o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal">On Sun, Jun 16, 2019 at 12:00 AM guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> const x = nameof y<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> const y = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> At line 1 adjacent to ```nameof``` how does the user even know that there is a variable that will be declared named ```y```?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> What is the output of ```x``` where there is no variable named ```y``` later declared?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> const x = nameof y<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> const z = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> On Sun, Jun 16, 2019 at 12:03 AM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" target="_blank" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> > What should occur where the code is<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> It would be "y" in all 3 places.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> > ... is a proposal for _more_ than only getting the _name_ of an _declared_ and _initialized_ variable?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> It is a proposal for getting the name of a _declared_ variable. Whether it is _initialized_ does not matter.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> > Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` is used?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> No, an error is not thrown. ECMAScript is much more nuanced. Block scoped variables from 'let' or 'const' exist and can be *referenced* (via closure or export, currently) anywhere within the same block scope, even before they are initialized.
 Until they have been *initialized* (the line of code contain the declaration has been reached and evaluated), they exist in a "Temporal Dead Zone" (TDZ). Attempting to *dereference* them (i.e. access or store a value) while in this TDZ is what results in the
 ReferenceError.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> At no point does the `nameof` operator *dereference* the variable, so no error need be thrown.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> From: guest271314<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Sent: Saturday, June 15, 4:29 PM<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> To: Ron Buckton<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Cc: <a href="mailto:es-discuss@mozilla.org" target="_blank" title="mailto:es-discuss@mozilla.org">
es-discuss@mozilla.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> What should occur where the code is<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const x = nameof y<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> await new Promise(resolve => setTimeout(resolve, 100000)); // should x be "y" here?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> await new Promise(resolve => setTimeout(resolve, 200000)); // should x be "y" here?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> await Promise.all([new Promise(resolve => setTimeout(resolve, 300000)), ...doStuff()]); // should x be "y" here?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const y = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> ?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> The immediately invoked arrow function example (where a ```RefeferenceError``` is thrown) appears to demonstrate that to output the expected result of ```nameof``` within the context of the code example<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const x = nameof y<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const y = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> is a proposal for _more_ than only getting the _name_ of an _declared_ and _initialized_ variable?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` is used?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> On Sat, Jun 15, 2019 at 11:16 PM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" target="_blank" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const x = nameof y<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const y = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> `x` would have the value “y”. It would not matter if `y` were initialized or had yet been reached during execution. It does not deviate from the purpose of `let` or `const`, because you are not accessing the value of the identifier.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> Also consider that this is legal ECMAScript in a module:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> export { y }<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> const y = 1;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> ```<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> The binding for `y` exists within the same block scope, it just has not yet been initialized. Exporting it via `export { y }`, closing over it via `() => y`, or accessing it via `nameof y` would all be the same. In all three cases you
 are accessing the *binding* of `y`, not the *value* of `y`. Even in the `() => y` case, you don’t access the *value* of `y` until you execute the function.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> From: guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Sent: Saturday, June 15, 2019 3:57 PM<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> To: Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" target="_blank" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Cc: <a href="mailto:es-discuss@mozilla.org" target="_blank" title="mailto:es-discuss@mozilla.org">
es-discuss@mozilla.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> > Sorry, I meant to say “not entirely correct”.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> You have not yet confirmed if in fact the expected output is referencing a variable declared using ```const``` on the current line _before_ initialization _on the next line_.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> That example appears to deviate from the purpose and usage of ```const```, beyond the scope of ```nameof```, and if were implemented, a ```ReferenceError``` should _not_ be thrown when a ```const``` variable that has yet to be initialized
 _on the next line_ is referred to _on the current line_?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> Aside from that example, the code which essentially already implements ```nameof``` should be able to be found in the code which implements ```ReferenceError``` relevant to ```const```.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> On Sat, Jun 15, 2019 at 10:47 PM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" target="_blank" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> Sorry, I meant to say “not entirely correct”.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> From: Ron Buckton<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Sent: Saturday, June 15, 2019 3:03 PM<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> To: guest271314 <<a href="mailto:guest271314@gmail.com" target="_blank" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Cc: <a href="mailto:es-discuss@mozilla.org" target="_blank" title="mailto:es-discuss@mozilla.org">
es-discuss@mozilla.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>> Subject: RE: Re: What do you think about a C# 6 like nameof() expression for<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> > At that point in the example code the identifer ```y``` does not exist.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>> That is not entirely incorrect. The identifier `y` exists, but its binding has not been initialized, otherwise you couldn’t refer to y in this case:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">>><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">> _______________________________________________<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> es-discuss mailing list<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> <a href="mailto:es-discuss@mozilla.org" target="_blank" title="mailto:es-discuss@mozilla.org">
es-discuss@mozilla.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">> <a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.mozilla.org%2Flistinfo%2Fes-discuss&data=02%7C01%7Cron.buckton%40microsoft.com%7Ccbc2c8f5e9614533e30e08d6f2e594ef%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636963465244040592&sdata=OTsSuKCHGxydR05TE3%2FnVD%2F%2FBwdEhrSeVF4jOu3C5C8%3D&reserved=0" target="_blank" title="https://mail.mozilla.org/listinfo/es-discuss">
https://mail.mozilla.org/listinfo/es-discuss</a><o:p></o:p></p>
</div>
</blockquote>
</div>
<div>
<p class="MsoNormal">_______________________________________________<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">es-discuss mailing list<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="mailto:es-discuss@mozilla.org" target="_blank" title="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.mozilla.org%2Flistinfo%2Fes-discuss&data=02%7C01%7Cron.buckton%40microsoft.com%7Ccbc2c8f5e9614533e30e08d6f2e594ef%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636963465244040592&sdata=OTsSuKCHGxydR05TE3%2FnVD%2F%2FBwdEhrSeVF4jOu3C5C8%3D&reserved=0" target="_blank" title="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a><o:p></o:p></p>
</div>
</div>
</blockquote>
</blockquote>
</div>
</div>
</blockquote>
<p class="MsoNormal">_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Fmail.mozilla.org%2Flistinfo%2Fes-discuss&data=02%7C01%7Cron.buckton%40microsoft.com%7Ccbc2c8f5e9614533e30e08d6f2e594ef%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C636963465244050588&sdata=JAmU28f9MfBmL52In00zA2UfMBAvYIdgR8vi4ixStFc%3D&reserved=0" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><o:p></o:p></p>
</div>
</body>
</html>