<div><span style="color:rgb(35, 31, 32)"><font style="font-size:13.02px"><font style="font-family:Nylas-Pro, Helvetica, sans-serif">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 </font></font></span><code>nameof y</code> is evaluated, <code>y</code> is already declared in the scope.</div><br><div>The special behaviour introduced with <code>let</code> and <code>const</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. </div><div>Since <code>nameof</code> doesn't care about the value, only the name of the variable, it would not <em>need</em> to throw an exception.</div><div>Of course, were this proposal to be taken seriously, it could be specced either way</div><br><div><signature id="local-9ac79ea1-f8aa"></signature></div><div class="gmail_quote_attribution">On Jun 17 2019, at 10:15 am, guest271314 <guest271314@gmail.com> wrote:</div><blockquote><div><div><div>> - If `y` is directly visible in scope and is neither a parameter or</div><div>destructured binding, `nameof y` should just evaluate to `"y"`. This</div><div>should be agnostic to whether the binding has been declared yet, so in</div><div>your example, `x` should be set to `"y"`.</div><div><br></div><div>The 1st question at <a href="https://esdiscuss.org/topic/what-do-you-think-about-a-c-6-like-nameof-expression-for#content-33" 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: </div><div><br></div><div>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```?</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div class="gmail_attr"><div>On Sun, Jun 16, 2019 at 7:04 AM Isiah Meadows <<a href="mailto:isiahmeadows@gmail.com" title="mailto:isiahmeadows@gmail.com">isiahmeadows@gmail.com</a>> wrote:</div></div><blockquote><div>Here's my opinion:</div><br><div>- If `y` is directly visible in scope and is neither a parameter or</div><div>destructured binding, `nameof y` should just evaluate to `"y"`. This</div><div>should be agnostic to whether the binding has been declared yet, so in</div><div>your example, `x` should be set to `"y"`.</div><div>- If `y` is entirely undeclared, it should be a runtime</div><div>`ReferenceError` in the same way it is when accessing undefined</div><div>globals. So in your second example, I'd expect it to throw before even</div><div>attempting assignment</div><br><div>-----</div><br><div>Isiah Meadows</div><div><a href="mailto:contact@isiahmeadows.com" title="mailto:contact@isiahmeadows.com">contact@isiahmeadows.com</a></div><div><a href="http://www.isiahmeadows.com" title="http://www.isiahmeadows.com">www.isiahmeadows.com</a></div><br><div>On Sun, Jun 16, 2019 at 12:00 AM guest271314 <<a href="mailto:guest271314@gmail.com" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>> wrote:</div><div>></div><div>> ```</div><div>> const x = nameof y</div><div>> const y = 1;</div><div>> ```</div><div>></div><div>> At line 1 adjacent to ```nameof``` how does the user even know that there is a variable that will be declared named ```y```?</div><div>></div><div>> What is the output of ```x``` where there is no variable named ```y``` later declared?</div><div>></div><div>> ```</div><div>> const x = nameof y</div><div>> const z = 1;</div><div>> ```</div><div>></div><div>> On Sun, Jun 16, 2019 at 12:03 AM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:</div><div>>></div><div>>> > What should occur where the code is</div><div>>></div><div>>> It would be "y" in all 3 places.</div><div>>></div><div>>> > ... is a proposal for _more_ than only getting the _name_ of an _declared_ and _initialized_ variable?</div><div>>></div><div>>> It is a proposal for getting the name of a _declared_ variable. Whether it is _initialized_ does not matter.</div><div>>></div><div>>> > Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` is used?</div><div>>></div><div>>> 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.</div><div>>></div><div>>> At no point does the `nameof` operator *dereference* the variable, so no error need be thrown.</div><div>>></div><div>>> From: guest271314</div><div>>> Sent: Saturday, June 15, 4:29 PM</div><div>>> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for</div><div>>> To: Ron Buckton</div><div>>> Cc: <a href="mailto:es-discuss@mozilla.org" title="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></div><div>>></div><div>>></div><div>>></div><div>>></div><div>>> What should occur where the code is</div><div>>></div><div>>> ```</div><div>>> const x = nameof y</div><div>>> await new Promise(resolve => setTimeout(resolve, 100000)); // should x be "y" here?</div><div>>> await new Promise(resolve => setTimeout(resolve, 200000)); // should x be "y" here?</div><div>>> await Promise.all([new Promise(resolve => setTimeout(resolve, 300000)), ...doStuff()]); // should x be "y" here?</div><div>>> const y = 1;</div><div>>> ```</div><div>>></div><div>>> ?</div><div>>></div><div>>> 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</div><div>>></div><div>>> ```</div><div>>> const x = nameof y</div><div>>> const y = 1;</div><div>>> ```</div><div>>></div><div>>> is a proposal for _more_ than only getting the _name_ of an _declared_ and _initialized_ variable?</div><div>>></div><div>>> Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` is used?</div><div>>></div><div>>> On Sat, Jun 15, 2019 at 11:16 PM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:</div><div>>></div><div>>> ```</div><div>>> const x = nameof y</div><div>>> const y = 1;</div><div>>> ```</div><div>>></div><div>>> `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.</div><div>>></div><div>>> Also consider that this is legal ECMAScript in a module:</div><div>>></div><div>>> ```</div><div>>> export { y }</div><div>>> const y = 1;</div><div>>> ```</div><div>>></div><div>>> 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.</div><div>>></div><div>>> From: guest271314 <<a href="mailto:guest271314@gmail.com" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>></div><div>>> Sent: Saturday, June 15, 2019 3:57 PM</div><div>>> To: Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>></div><div>>> Cc: <a href="mailto:es-discuss@mozilla.org" title="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></div><div>>> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for</div><div>>></div><div>>> > Sorry, I meant to say “not entirely correct”.</div><div>>></div><div>>> 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_.</div><div>>></div><div>>> 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_?</div><div>>></div><div>>> 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```.</div><div>>></div><div>>> On Sat, Jun 15, 2019 at 10:47 PM Ron Buckton <<a href="mailto:Ron.Buckton@microsoft.com" title="mailto:Ron.Buckton@microsoft.com">Ron.Buckton@microsoft.com</a>> wrote:</div><div>>></div><div>>> Sorry, I meant to say “not entirely correct”.</div><div>>></div><div>>> From: Ron Buckton</div><div>>> Sent: Saturday, June 15, 2019 3:03 PM</div><div>>> To: guest271314 <<a href="mailto:guest271314@gmail.com" title="mailto:guest271314@gmail.com">guest271314@gmail.com</a>></div><div>>> Cc: <a href="mailto:es-discuss@mozilla.org" title="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></div><div>>> Subject: RE: Re: What do you think about a C# 6 like nameof() expression for</div><div>>></div><div>>> > At that point in the example code the identifer ```y``` does not exist.</div><div>>></div><div>>> 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:</div><div>>></div><div>>></div><div>>></div><div>>></div><div>> _______________________________________________</div><div>> es-discuss mailing list</div><div>> <a href="mailto:es-discuss@mozilla.org" title="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a></div><div>> <a href="https://mail.mozilla.org/listinfo/es-discuss" title="https://mail.mozilla.org/listinfo/es-discuss">https://mail.mozilla.org/listinfo/es-discuss</a></div></blockquote></div><div>_______________________________________________</div><div>es-discuss mailing list</div><div>es-discuss@mozilla.org</div><div>https://mail.mozilla.org/listinfo/es-discuss</div></div></blockquote>