title: Why can the `async` and `await` keywords be assigned to?
body: <p>I noticed that the <code>async</code> keyword can be assigned any value whatsoever and even used as a normal variable:</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>let async = "world";
  
  console.log(async)
  console.log("Hello " + async)</code></pre>
  </div>
  </div>
  </p>
  
  <p>Yet, even then it continues to operate as before:</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>let async = "world";
  
  async function foo(input) {
    return input;
  }
  
  let barPromise = foo("bar");
  
  console.log("bar promise is:", typeof barPromise);
  
  console.log("bar promise also has a .then:", typeof barPromise.then === "function");
  
  barPromise
    .then(output =&gt; console.log("bar promise returns:", output));
  
  console.log("async is still assigned:", async);
  
  foo("Hello ")
    .then(output =&gt; console.log(output + async));</code></pre>
  </div>
  </div>
  </p>
  
  <p>Even <code>await</code> is doing the same thing:</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>let await = "world";
  
  console.log("await is:", await)
  
  async function foo(input) {
    return input;
  }
  
  async function bar(input) {
    console.log("before");
    
    let output = await foo(input);
    console.log(output);
    
    console.log("after");
  }
  
  bar("hello")</code></pre>
  </div>
  </div>
  </p>
  
  <p>What is going on here? Why are the keywords usable as a variables?</p>