Here's my opinion: - If `y` is directly visible in scope and is neither a parameter or destructured binding, `nameof y` should just evaluate to `"y"`. This should be agnostic to whether the binding has been declared yet, so in your example, `x` should be set to `"y"`. - If `y` is entirely undeclared, it should be a runtime `ReferenceError` in the same way it is when accessing undefined globals. So in your second example, I'd expect it to throw before even attempting assignment
----- Isiah Meadows cont...@isiahmeadows.com www.isiahmeadows.com On Sun, Jun 16, 2019 at 12:00 AM guest271314 <guest271...@gmail.com> wrote: > > ``` > const x = nameof y > const y = 1; > ``` > > At line 1 adjacent to ```nameof``` how does the user even know that there is > a variable that will be declared named ```y```? > > What is the output of ```x``` where there is no variable named ```y``` later > declared? > > ``` > const x = nameof y > const z = 1; > ``` > > On Sun, Jun 16, 2019 at 12:03 AM Ron Buckton <ron.buck...@microsoft.com> > wrote: >> >> > What should occur where the code is >> >> It would be "y" in all 3 places. >> >> > ... is a proposal for _more_ than only getting the _name_ of an _declared_ >> > and _initialized_ variable? >> >> It is a proposal for getting the name of a _declared_ variable. Whether it >> is _initialized_ does not matter. >> >> > Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` >> > is used? >> >> 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. >> >> At no point does the `nameof` operator *dereference* the variable, so no >> error need be thrown. >> >> From: guest271314 >> Sent: Saturday, June 15, 4:29 PM >> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for >> To: Ron Buckton >> Cc: es-discuss@mozilla.org >> >> >> >> >> What should occur where the code is >> >> ``` >> const x = nameof y >> await new Promise(resolve => setTimeout(resolve, 100000)); // should x be >> "y" here? >> await new Promise(resolve => setTimeout(resolve, 200000)); // should x be >> "y" here? >> await Promise.all([new Promise(resolve => setTimeout(resolve, 300000)), >> ...doStuff()]); // should x be "y" here? >> const y = 1; >> ``` >> >> ? >> >> 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 >> >> ``` >> const x = nameof y >> const y = 1; >> ``` >> >> is a proposal for _more_ than only getting the _name_ of an _declared_ and >> _initialized_ variable? >> >> Should a ```RefefenceError``` _not_ be thrown simple because ```nameof``` is >> used? >> >> On Sat, Jun 15, 2019 at 11:16 PM Ron Buckton <ron.buck...@microsoft.com> >> wrote: >> >> ``` >> const x = nameof y >> const y = 1; >> ``` >> >> `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. >> >> Also consider that this is legal ECMAScript in a module: >> >> ``` >> export { y } >> const y = 1; >> ``` >> >> 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. >> >> From: guest271314 <guest271...@gmail.com> >> Sent: Saturday, June 15, 2019 3:57 PM >> To: Ron Buckton <ron.buck...@microsoft.com> >> Cc: es-discuss@mozilla.org >> Subject: Re: Re: What do you think about a C# 6 like nameof() expression for >> >> > Sorry, I meant to say “not entirely correct”. >> >> 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_. >> >> 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_? >> >> 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```. >> >> On Sat, Jun 15, 2019 at 10:47 PM Ron Buckton <ron.buck...@microsoft.com> >> wrote: >> >> Sorry, I meant to say “not entirely correct”. >> >> From: Ron Buckton >> Sent: Saturday, June 15, 2019 3:03 PM >> To: guest271314 <guest271...@gmail.com> >> Cc: es-discuss@mozilla.org >> Subject: RE: Re: What do you think about a C# 6 like nameof() expression for >> >> > At that point in the example code the identifer ```y``` does not exist. >> >> 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: >> >> >> >> > _______________________________________________ > 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