title: Why are await and async valid variable names?
body: <p>I was experimenting with how <code>/</code> is interpreted when around different keywords and operators, and found that the following syntax is perfectly legal:</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>// awaiting something that isn't a Promise is fine, it's just strange to do:
  const foo = await /barbaz/
  myFn()</code></pre>
  </div>
  </div>
  </p>
  
  <p>Error:</p>
  
  <blockquote>
    <p>Uncaught ReferenceError: await is not defined</p>
  </blockquote>
  
  <p>It looks like it tries to parse the <code>await</code> as a <em>variable name</em>..? I was expecting</p>
  
  <blockquote>
    <p>await is only valid in async function</p>
  </blockquote>
  
  <p>or maybe something like</p>
  
  <blockquote>
    <p>Unexpected token await</p>
  </blockquote>
  
  <p>To my horror, you can even assign things to it:</p>
  
  <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
  <div class="snippet-code">
  <pre class="snippet-code-js lang-js prettyprint-override"><code>const await = 'Wait, this actually works?';
  console.log(await);</code></pre>
  </div>
  </div>
  </p>
  
  <p>Shouldn't something so obviously wrong cause a syntax error, as it does with <code>let</code>, <code>finally</code>, <code>break</code>, etc? Why is this allowed, and what the heck is going on in the first snippet?</p>