Home | History | Annotate | Download | only in google-styleguide
      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4 <meta charset="utf-8">
      5 <title>Google JavaScript Style Guide</title>
      6 <link rel="stylesheet" href="javaguide.css">
      7 <script src="include/styleguide.js"></script>
      8 <link rel="shortcut icon" href="https://www.google.com/favicon.ico">
      9 <script src="include/jsguide.js"></script>
     10 </head>
     11 <body onload="initStyleGuide();">
     12 <div id="content">
     13 <h1>Google JavaScript Style Guide</h1>
     14 <h2 id="introduction">1 Introduction</h2>
     15 
     16 <p>This document serves as the <strong>complete</strong> definition of Google&#8217;s coding standards
     17 for source code in the JavaScript programming language. A JavaScript source file
     18 is described as being <em>in Google Style</em> if and only if it adheres to the rules
     19 herein.</p>
     20 
     21 <p>Like other programming style guides, the issues covered span not only aesthetic
     22 issues of formatting, but other types of conventions or coding standards as
     23 well. However, this document focuses primarily on the hard-and-fast rules that
     24 we follow universally, and avoids giving advice that isn't clearly enforceable
     25 (whether by human or tool). </p>
     26 
     27 <h3 id="terminology-notes">1.1 Terminology notes</h3>
     28 
     29 <p>In this document, unless otherwise clarified:</p>
     30 
     31 <ol>
     32 <li><p>The term <em>comment</em> always refers to <em>implementation</em> comments. We do not use
     33 the phrase <q>documentation comments</q>, instead using the common term &#8220;JSDoc&#8221;
     34 for both human-readable text and machine-readable annotations within
     35 <code>/** &#8230; */</code>.</p></li>
     36 <li><p>This Style Guide uses <a href="http://tools.ietf.org/html/rfc2119">RFC 2119</a> terminology when using the phrases <em>must</em>,
     37 <em>must not</em>, <em>should</em>, <em>should not</em>, and <em>may</em>.  The terms <em>prefer</em> and
     38 <em>avoid</em> correspond to <em>should</em> and <em>should not</em>, respectively.  Imperative
     39 and declarative statements are prescriptive and correspond to <em>must</em>.</p></li>
     40 </ol>
     41 
     42 <p>Other <q>terminology notes</q> will appear occasionally throughout the document.</p>
     43 
     44 <h3 id="guide-notes">1.2 Guide notes</h3>
     45 
     46 <p>Example code in this document is <strong>non-normative</strong>. That is, while the examples
     47 are in Google Style, they may not illustrate the <em>only</em> stylish way to represent
     48 the code. Optional formatting choices made in examples must not be enforced as
     49 rules.</p>
     50 
     51 <h2 id="source-file-basics">2 Source file basics</h2>
     52 
     53 <h3 id="file-name">2.1 File name</h3>
     54 
     55 <p>File names must be all lowercase and may include underscores (<code>_</code>) or dashes
     56 (<code>-</code>), but no additional punctuation. Follow the convention that your project
     57 uses. Filenames&#8217; extension must be <code>.js</code>.</p>
     58 
     59 <h3 id="file-encoding">2.2 File encoding: UTF-8</h3>
     60 
     61 <p>Source files are encoded in <strong>UTF-8</strong>.</p>
     62 
     63 <h3 id="special-characters">2.3 Special characters</h3>
     64 
     65 <h4 id="whitespace-characters">2.3.1 Whitespace characters</h4>
     66 
     67 <p>Aside from the line terminator sequence, the ASCII horizontal space character
     68 (0x20) is the only whitespace character that appears anywhere in a source
     69 file. This implies that</p>
     70 
     71 <ol>
     72 <li><p>All other whitespace characters in string literals are escaped, and</p></li>
     73 <li><p>Tab characters are <strong>not</strong> used for indentation.</p></li>
     74 </ol>
     75 
     76 <h4 id="special-escape-sequences">2.3.2 Special escape sequences</h4>
     77 
     78 <p>For any character that has a special escape sequence (<code>\'</code>, <code>\"</code>, <code>\\</code>, <code>\b</code>,
     79 <code>\f</code>, <code>\n</code>, <code>\r</code>, <code>\t</code>, <code>\v</code>), that sequence is used rather than the
     80 corresponding numeric escape (e.g <code>\x0a</code>, <code>\u000a</code>, or <code>\u{a}</code>). Legacy octal
     81 escapes are never used.</p>
     82 
     83 <h4 id="non-ascii-characters">2.3.3 Non-ASCII characters</h4>
     84 
     85 <p>For the remaining non-ASCII characters, either the actual Unicode character
     86 (e.g. <code>&#8734;</code>) or the equivalent hex or Unicode escape (e.g. <code>\u221e</code>) is used,
     87 depending only on which makes the code <strong>easier to read and understand</strong>.</p>
     88 
     89 <p>Tip: In the Unicode escape case, and occasionally even when actual Unicode
     90 characters are used, an explanatory comment can be very helpful.</p>
     91 
     92 <table>
     93   <thead>
     94     <tr>
     95       <th>Example
     96       </th><th>Discussion
     97   </th></tr></thead><tbody>
     98     <tr>
     99       <td><code class="prettyprint lang-js">const units = '&#956;s';</code>
    100       </td><td>Best: perfectly clear even without a comment.
    101     </td></tr><tr>
    102       <td>
    103         <code class="prettyprint lang-js">const units = '\u03bcs'; // '&#956;s'
    104         </code>
    105       </td><td>Allowed, but there&#8217;s no reason to do this.
    106     </td></tr><tr>
    107       <td>
    108         <code class="prettyprint lang-js">const units = '\u03bcs'; // Greek letter mu, 's'
    109         </code>
    110       </td><td>Allowed, but awkward and prone to mistakes.
    111     </td></tr><tr>
    112       <td><code class="badcode">const units = '\u03bcs';</code>
    113       </td><td>Poor: the reader has no idea what this is.
    114     </td></tr><tr>
    115       <td>
    116         <code class="prettyprint lang-js">return '\ufeff' + content;  // byte order mark
    117         </code>
    118       </td><td>
    119         Good: use escapes for non-printable characters, and comment if
    120         necessary.
    121 </td></tr></tbody></table>
    122 
    123 <p>Tip: Never make your code less readable simply out of fear that some programs
    124 might not handle non-ASCII characters properly. If that happens, those programs
    125 are <strong>broken</strong> and they must be <strong>fixed</strong>.</p>
    126 
    127 <h2 id="source-file-structure">3 Source file structure</h2>
    128 
    129 <p>A source file consists of, <strong>in order</strong>:</p>
    130 
    131 <ol>
    132 <li>License or copyright information, if present</li>
    133 <li><code>@fileoverview</code> JSDoc, if present</li>
    134 <li><code>goog.module</code> statement</li>
    135 <li><code>goog.require</code> statements</li>
    136 <li>The file&#8217;s implementation</li>
    137 </ol>
    138 
    139 <p><strong>Exactly one blank line</strong> separates each section that is present, except the
    140 file's implementation, which may be preceded by 1 or 2 blank lines.</p>
    141 
    142 <h3 id="file-copyright">3.1 License or copyright information, if present</h3>
    143 
    144 <p>If license or copyright information belongs in a file, it belongs here.</p>
    145 
    146 <h3 id="file-fileoverview">3.2 <code>@fileoverview</code> JSDoc, if present</h3>
    147 
    148 <p>See <a href="#jsdoc-top-file-level-comments">??</a> for formatting rules.</p>
    149 
    150 <h3 id="file-goog-module">3.3 <code>goog.module</code> statement</h3>
    151 
    152 <p>All files must declare exactly one <code>goog.module</code> name on a single line: lines
    153 containing a <code>goog.module</code> declaration must not be wrapped, and are therefore an
    154 exception to the 80-column limit.</p>
    155 
    156 <p>The entire argument to goog.module is what defines a namespace.  It is the
    157 package name (an identifier that reflects the fragment of the directory
    158 structure where the code lives) plus, optionally, the main class/enum/interface
    159 that it defines concatenated to the end.</p>
    160 
    161 <p>Example</p>
    162 
    163 <pre><code class="language-js prettyprint">goog.module('search.urlHistory.UrlHistoryService');
    164 </code></pre>
    165 
    166 <h4 id="naming-hierarchy">3.3.1 Hierarchy</h4>
    167 
    168 <p>Module namespaces may never be named as a <em>direct</em> child of another module's
    169 namespace.</p>
    170 
    171 <p>Illegal:</p>
    172 
    173 <pre><code class="language-js prettyprint badcode">goog.module('foo.bar');   // 'foo.bar.qux' would be fine, though
    174 goog.module('foo.bar.baz');
    175 </code></pre>
    176 
    177 <p>The directory hierarchy reflects the namespace hierarchy, so that deeper-nested
    178 children are subdirectories of higher-level parent directories.  Note that this
    179 implies that owners of &#8220;parent&#8221; namespace groups are necessarily aware of all
    180 child namespaces, since they exist in the same directory.</p>
    181 
    182 <h4 id="file-set-test-only">3.3.2 <code>goog.setTestOnly</code></h4>
    183 
    184 <p>The single <code>goog.module</code> statement may optionally be followed by a call to
    185 goog.setTestOnly().</p>
    186 
    187 <h4 id="file-declare-legacy-namespace">3.3.3 <code>goog.module.declareLegacyNamespace</code></h4>
    188 
    189 <p>The single <code>goog.module</code> statement may optionally be followed by a call to
    190 <code>goog.module.declareLegacyNamespace();</code>. Avoid
    191 <code>goog.module.declareLegacyNamespace()</code> when possible.</p>
    192 
    193 <p>Example:</p>
    194 
    195 <pre><code class="language-js prettyprint">goog.module('my.test.helpers');
    196 goog.module.declareLegacyNamespace();
    197 goog.setTestOnly();
    198 </code></pre>
    199 
    200 <p><code>goog.module.declareLegacyNamespace</code> exists to ease the transition from
    201 traditional object hierarchy-based namespaces but comes with some naming
    202 restrictions. As the child module name must be created after the parent
    203 namespace, this name <strong>must not</strong> be a child or parent of any other
    204 <code>goog.module</code> (for example, <code>goog.module('parent');</code> and
    205 <code>goog.module('parent.child');</code> cannot both exist safely, nor can
    206 <code>goog.module('parent');</code> and <code>goog.module('parent.child.grandchild');</code>).</p>
    207 
    208 <h4 id="file-es6-modules">3.3.4 ES6 Modules</h4>
    209 
    210 <p>Do not use ES6 modules yet (i.e. the <code>export</code> and <code>import</code> keywords), as their
    211 semantics are not yet finalized. Note that this policy will be revisited once
    212 the semantics are fully-standard.</p>
    213 
    214 <h3 id="file-goog-require">3.4 <code>goog.require</code> statements</h3>
    215 
    216 <p>Imports are done with <code>goog.require</code> statements, grouped together immediately
    217 following the module declaration. Each <code>goog.require</code> is assigned to a single
    218 constant alias, or else destructured into several constant aliases. These
    219 aliases are the only acceptable way to refer to the <code>require</code>d dependency,
    220 whether in code or in type annotations: the fully qualified name is never used
    221 except as the argument to <code>goog.require</code>. Alias names should match the final
    222 dot-separated component of the imported module name when possible, though
    223 additional components may be included (with appropriate casing such that the
    224 alias' casing still correctly identifies its type) if necessary to
    225 disambiguate, or if it significantly improves readability. <code>goog.require</code>
    226 statements may not appear anywhere else in the file.</p>
    227 
    228 <p>If a module is imported only for its side effects, the assignment may be
    229 omitted, but the fully qualified name may not appear anywhere else in the file.
    230 A comment is required to explain why this is needed and suppress a compiler
    231 warning.</p>
    232 
    233 
    234 
    235 <p>The lines are sorted according to the following rules: All requires with a name
    236 on the left hand side come first, sorted alphabetically by those names. Then
    237 destructuring requires, again sorted by the names on the left hand side.
    238 Finally, any <code>goog.require</code> calls that are standalone (generally these are for
    239 modules imported just for their side effects).</p>
    240 
    241 <p>Tip: There&#8217;s no need to memorize this order and enforce it manually. You can
    242 rely on your IDE to report requires
    243 that are not sorted correctly.</p>
    244 
    245 <p>If a long alias or module name would cause a line to exceed the 80-column limit,
    246 it <strong>must not</strong> be wrapped: goog.require lines are an exception to the 80-column
    247 limit.</p>
    248 
    249 <p>Example:</p>
    250 
    251 <pre><code class="language-js prettyprint">const MyClass = goog.require('some.package.MyClass');
    252 const NsMyClass = goog.require('other.ns.MyClass');
    253 const googAsserts = goog.require('goog.asserts');
    254 const testingAsserts = goog.require('goog.testing.asserts');
    255 const than80columns = goog.require('pretend.this.is.longer.than80columns');
    256 const {clear, forEach, map} = goog.require('goog.array');
    257 /** @suppress {extraRequire} Initializes MyFramework. */
    258 goog.require('my.framework.initialization');
    259 </code></pre>
    260 
    261 <p>Illegal:</p>
    262 
    263 <pre><code class="language-js badcode prettyprint">const randomName = goog.require('something.else'); // name must match
    264 
    265 const {clear, forEach, map} = // don't break lines
    266     goog.require('goog.array');
    267 
    268 function someFunction() {
    269   const alias = goog.require('my.long.name.alias'); // must be at top level
    270   // &#8230;
    271 }
    272 </code></pre>
    273 
    274 <h4 id="file-goog-forward-declare">3.4.1 <code>goog.forwardDeclare</code></h4>
    275 
    276 <p><code>goog.forwardDeclare</code> is not needed very often, but is a valuable tool to break
    277 circular dependencies or to reference late loaded code. These statements are
    278 grouped together and immediately follow any <code>goog.require</code> statements. A
    279 <code>goog.forwardDeclare</code> statement must follow the same style rules as a
    280 <code>goog.require</code> statement.</p>
    281 
    282 <h3 id="file-implementation">3.5 The file&#8217;s implementation</h3>
    283 
    284 <p>The actual implementation follows after all dependency information is declared
    285 (separated by at least one blank line).</p>
    286 
    287 <p>This may consist of any module-local declarations (constants, variables,
    288 classes, functions, etc), as well as any exported symbols.
    289 </p>
    290 
    291 <h2 id="formatting">4 Formatting</h2>
    292 
    293 <p><strong>Terminology Note</strong>: <em>block-like construct</em> refers to the body of a class,
    294 function, method, or brace-delimited block of code.  Note that, by
    295 <a href="#features-array-literals">??</a> and <a href="#features-object-literals">??</a>, any array or
    296 object literal may optionally be treated as if it were a block-like construct.</p>
    297 
    298 <p>Tip: Use <code>clang-format</code>. The JavaScript community has invested effort to make
    299 sure clang-format <q>does the right thing</q> on JavaScript files. <code>clang-format</code> has
    300 integration with several popular
    301 editors.</p>
    302 
    303 <h3 id="formatting-braces">4.1 Braces</h3>
    304 
    305 <h4 id="formatting-braces-all">4.1.1 Braces are used for all control structures</h4>
    306 
    307 <p>Braces are required for all control structures (i.e. <code>if</code>, <code>else</code>, <code>for</code>, <code>do</code>,
    308 <code>while</code>, as well as any others), even if the body contains only a single
    309 statement.  The first statement of a non-empty block must begin on its own line.</p>
    310 
    311 <p>Illegal:</p>
    312 
    313 <pre><code class="language-js badcode prettyprint">if (someVeryLongCondition())
    314   doSomething();
    315 
    316 for (let i = 0; i &lt; foo.length; i++) bar(foo[i]);
    317 </code></pre>
    318 
    319 <p><strong>Exception</strong>: A simple if statement that can fit entirely on a single line with
    320 no wrapping (and that doesn&#8217;t have an else) may be kept on a single line with no
    321 braces when it improves readability.  This is the only case in which a control
    322 structure may omit braces and newlines.</p>
    323 
    324 <pre><code class="language-js prettyprint">if (shortCondition()) return;
    325 </code></pre>
    326 
    327 <h4 id="formatting-nonempty-blocks">4.1.2 Nonempty blocks: K&amp;R style</h4>
    328 
    329 <p>Braces follow the Kernighan and Ritchie style (<q><a href="http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html">Egyptian brackets</a></q>) for
    330 <em>nonempty</em> blocks and block-like constructs:</p>
    331 
    332 <ul>
    333 <li>No line break before the opening brace.</li>
    334 <li>Line break after the opening brace.</li>
    335 <li>Line break before the closing brace.</li>
    336 <li>Line break after the closing brace <em>if</em> that brace terminates a statement or
    337 the body of a function or class statement, or a class method. Specifically,
    338 there is <em>no</em> line break after the brace if it is followed by <code>else</code>, <code>catch</code>,
    339 <code>while</code>, or a comma, semicolon, or right-parenthesis.</li>
    340 </ul>
    341 
    342 <p>Example:</p>
    343 
    344 <pre><code class="language-js prettyprint">class InnerClass {
    345   constructor() {}
    346 
    347   /** @param {number} foo */
    348   method(foo) {
    349     if (condition(foo)) {
    350       try {
    351         // Note: this might fail.
    352         something();
    353       } catch (err) {
    354         recover();
    355       }
    356     }
    357   }
    358 }
    359 </code></pre>
    360 
    361 <h4 id="formatting-empty-blocks">4.1.3 Empty blocks: may be concise</h4>
    362 
    363 <p>An empty block or block-like construct <em>may</em> be closed immediately after it is
    364 opened, with no characters, space, or line break in between (i.e. <code>{}</code>),
    365 <strong>unless</strong> it is a part of a <em>multi-block statement</em> (one that directly contains
    366 multiple blocks: <code>if</code>/<code>else</code> or <code>try</code>/<code>catch</code>/<code>finally</code>).</p>
    367 
    368 <p>Example:</p>
    369 
    370 <pre><code class="language-js prettyprint">function doNothing() {}
    371 </code></pre>
    372 
    373 <p>Illegal:</p>
    374 
    375 <pre><code class="language-js prettyprint badcode">if (condition) {
    376   // &#8230;
    377 } else if (otherCondition) {} else {
    378   // &#8230;
    379 }
    380 
    381 try {
    382   // &#8230;
    383 } catch (e) {}
    384 </code></pre>
    385 
    386 <h3 id="formatting-block-indentation">4.2 Block indentation: +2 spaces</h3>
    387 
    388 <p>Each time a new block or block-like construct is opened, the indent increases by
    389 two spaces. When the block ends, the indent returns to the previous indent
    390 level. The indent level applies to both code and comments throughout the
    391 block. (See the example in <a href="#formatting-nonempty-blocks">??</a>).</p>
    392 
    393 <h4 id="formatting-array-literals">4.2.1 Array literals: optionally <q>block-like</q></h4>
    394 
    395 <p>Any array literal may optionally be formatted as if it were a &#8220;block-like
    396 construct.&#8221; For example, the following are all valid (<strong>not</strong> an exhaustive
    397 list):</p>
    398 
    399 <pre><code class="language-js prettyprint columns">const a = [
    400   0,
    401   1,
    402   2,
    403 ];
    404 
    405 const b =
    406     [0, 1, 2];
    407 
    408 </code></pre>
    409 
    410 <pre><code class="language-js prettyprint columns">const c = [0, 1, 2];
    411 
    412 someMethod(foo, [
    413   0, 1, 2,
    414 ], bar);
    415 </code></pre>
    416 
    417 <p>Other combinations are allowed, particularly when emphasizing semantic groupings
    418 between elements, but should not be used only to reduce the vertical size of
    419 larger arrays.</p>
    420 
    421 <h4 id="formatting-object-literals">4.2.2 Object literals: optionally <q>block-like</q></h4>
    422 
    423 <p>Any object literal may optionally be formatted as if it were a &#8220;block-like
    424 construct.&#8221; The same examples apply as <a href="#formatting-array-literals">??</a>. For
    425 example, the following are all valid (<strong>not</strong> an exhaustive list):</p>
    426 
    427 <pre><code class="language-js prettyprint columns">const a = {
    428   a: 0,
    429   b: 1,
    430 };
    431 
    432 const b =
    433     {a: 0, b: 1};
    434 </code></pre>
    435 
    436 <pre><code class="language-js prettyprint columns">const c = {a: 0, b: 1};
    437 
    438 someMethod(foo, {
    439   a: 0, b: 1,
    440 }, bar);
    441 </code></pre>
    442 
    443 <h4 id="formatting-class-literals">4.2.3 Class literals</h4>
    444 
    445 <p>Class literals (whether declarations or expressions) are indented as blocks. Do
    446 not add semicolons after methods, or after the closing brace of a class
    447 <em>declaration</em> (statements&#8212;such as assignments&#8212;that contain class <em>expressions</em>
    448 are still terminated with a semicolon). Use the <code>extends</code> keyword, but not the
    449 <code>@extends</code> JSDoc annotation unless the class extends a templatized type.</p>
    450 
    451 <p>Example:</p>
    452 
    453 <pre><code class="language-js prettyprint columns">class Foo {
    454   constructor() {
    455     /** @type {number} */
    456     this.x = 42;
    457   }
    458 
    459   /** @return {number} */
    460   method() {
    461     return this.x;
    462   }
    463 }
    464 Foo.Empty = class {};
    465 </code></pre>
    466 
    467 <pre><code class="language-js prettyprint columns">/** @extends {Foo&lt;string&gt;} */
    468 foo.Bar = class extends Foo {
    469   /** @override */
    470   method() {
    471     return super.method() / 2;
    472   }
    473 };
    474 
    475 /** @interface */
    476 class Frobnicator {
    477   /** @param {string} message */
    478   frobnicate(message) {}
    479 }
    480 </code></pre>
    481 
    482 <h4 id="formatting-function-expressions">4.2.4 Function expressions</h4>
    483 
    484 <p>When declaring an anonymous function in the list of arguments for a function
    485 call, the body of the function is indented two spaces more than the preceding
    486 indentation depth.</p>
    487 
    488 <p>Example:</p>
    489 
    490 <pre><code class="language-js prettyprint">prefix.something.reallyLongFunctionName('whatever', (a1, a2) =&gt; {
    491   // Indent the function body +2 relative to indentation depth
    492   // of the 'prefix' statement one line above.
    493   if (a1.equals(a2)) {
    494     someOtherLongFunctionName(a1);
    495   } else {
    496     andNowForSomethingCompletelyDifferent(a2.parrot);
    497   }
    498 });
    499 
    500 some.reallyLongFunctionCall(arg1, arg2, arg3)
    501     .thatsWrapped()
    502     .then((result) =&gt; {
    503       // Indent the function body +2 relative to the indentation depth
    504       // of the '.then()' call.
    505       if (result) {
    506         result.use();
    507       }
    508     });
    509 </code></pre>
    510 
    511 <h4 id="formatting-switch-statements">4.2.5 Switch statements</h4>
    512 
    513 <p>As with any other block, the contents of a switch block are indented +2.</p>
    514 
    515 
    516 
    517 <p>After a switch label, a newline appears, and the indentation level is increased
    518 +2, exactly as if a block were being opened. An explicit block may be used if
    519 required by lexical scoping. The following switch label returns to the previous
    520 indentation level, as if a block had been closed.</p>
    521 
    522 <p>A blank line is optional between a <code>break</code> and the following case.</p>
    523 
    524 <p>Example:</p>
    525 
    526 <pre><code class="language-js prettyprint">switch (animal) {
    527   case Animal.BANDERSNATCH:
    528     handleBandersnatch();
    529     break;
    530 
    531   case Animal.JABBERWOCK:
    532     handleJabberwock();
    533     break;
    534 
    535   default:
    536     throw new Error('Unknown animal');
    537 }
    538 </code></pre>
    539 
    540 <h3 id="formatting-statements">4.3 Statements</h3>
    541 
    542 <h4 id="formatting-one-statement-perline">4.3.1 One statement per line</h4>
    543 
    544 <p>Each statement is followed by a line-break.</p>
    545 
    546 <h4 id="formatting-semicolons-are-required">4.3.2 Semicolons are required</h4>
    547 
    548 <p>Every statement must be terminated with a semicolon. Relying on automatic
    549 semicolon insertion is forbidden.</p>
    550 
    551 <h3 id="formatting-column-limit">4.4 Column limit: 80</h3>
    552 
    553 <p>JavaScript code has a column limit of 80 characters. Except as noted below, any
    554 line that would exceed this limit must be line-wrapped, as explained in
    555 <a href="#formatting-line-wrapping">??</a>.</p>
    556 
    557 <p><strong>Exceptions:</strong></p>
    558 
    559 <ol>
    560 <li>Lines where obeying the column limit is not possible (for example, a long URL
    561 in JSDoc or a shell command intended to be copied-and-pasted).</li>
    562 <li><code>goog.module</code> and <code>goog.require</code> statements (see <a href="#file-goog-module">??</a> and
    563 <a href="#file-goog-require">??</a>).</li>
    564 </ol>
    565 
    566 <h3 id="formatting-line-wrapping">4.5 Line-wrapping</h3>
    567 
    568 <p><strong>Terminology Note</strong>: <em>Line-wrapping</em> is defined as breaking a single expression
    569 into multiple lines.</p>
    570 
    571 <p>There is no comprehensive, deterministic formula showing <em>exactly</em> how to
    572 line-wrap in every situation. Very often there are several valid ways to
    573 line-wrap the same piece of code.</p>
    574 
    575 <p>Note: While the typical reason for line-wrapping is to avoid overflowing the
    576 column limit, even code that would in fact fit within the column limit may be
    577 line-wrapped at the author's discretion.</p>
    578 
    579 <p>Tip: Extracting a method or local variable may solve the problem without the
    580 need to line-wrap.</p>
    581 
    582 <h4 id="formatting-where-to-break">4.5.1 Where to break</h4>
    583 
    584 <p>The prime directive of line-wrapping is: prefer to break at a <strong>higher syntactic
    585 level</strong>. </p>
    586 
    587 <p>Preferred:</p>
    588 
    589 <pre><code class="language-js prettyprint">currentEstimate =
    590     calc(currentEstimate + x * currentEstimate) /
    591         2.0f;
    592 </code></pre>
    593 
    594 <p>Discouraged:</p>
    595 
    596 <pre><code class="language-js prettyprint badcode">currentEstimate = calc(currentEstimate + x *
    597     currentEstimate) / 2.0f;
    598 </code></pre>
    599 
    600 <p>In the preceding example, the syntactic levels from highest to lowest are as
    601 follows: assignment, division, function call, parameters, number constant.</p>
    602 
    603 <p>Operators are wrapped as follows:</p>
    604 
    605 <ol>
    606 <li>When a line is broken at an operator the break comes after the symbol. (Note
    607 that this is not the same practice used in Google style for Java.)
    608 <ol>
    609 <li>This does not apply to the <q>dot</q> (<code>.</code>), which is not actually an
    610 operator.</li>
    611 </ol></li>
    612 <li>A method or constructor name stays attached to the open parenthesis (<code>(</code>)
    613 that follows it.</li>
    614 <li>A comma (<code>,</code>) stays attached to the token that precedes it.</li>
    615 </ol>
    616 
    617 <blockquote>
    618 <p>Note: The primary goal for line wrapping is to have clear code, not
    619 necessarily code that fits in the smallest number of lines.</p>
    620 </blockquote>
    621 
    622 <h4 id="formatting-indent">4.5.2 Indent continuation lines at least +4 spaces</h4>
    623 
    624 <p>When line-wrapping, each line after the first (each <em>continuation line</em>) is
    625 indented at least +4 from the original line, unless it falls under the rules of
    626 block indentation.</p>
    627 
    628 <p>When there are multiple continuation lines, indentation may be varied beyond +4
    629 as appropriate.  In general, continuation lines at a deeper syntactic level are
    630 indented by larger multiples of 4, and two lines use the same indentation level
    631 if and only if they begin with syntactically parallel elements.</p>
    632 
    633 <p><a href="#formatting-horizontal-alignment">??</a> addresses the discouraged practice of
    634 using a variable number of spaces to align certain tokens with previous lines.</p>
    635 
    636 <h3 id="formatting-whitespace">4.6 Whitespace</h3>
    637 
    638 <h4 id="formatting-vertical-whitespace">4.6.1 Vertical whitespace</h4>
    639 
    640 <p>A single blank line appears:</p>
    641 
    642 <ol>
    643 <li>Between consecutive methods in a class or object literal
    644 <ol>
    645 <li>Exception: A blank line between two consecutive properties definitions in
    646 an object literal (with no other code between them) is optional. Such
    647 blank lines are used as needed to create <em>logical groupings</em> of fields.</li>
    648 </ol></li>
    649 <li>Within method bodies, sparingly to create <em>logical groupings</em> of statements.
    650 Blank lines at the start or end of a function body are not allowed.</li>
    651 <li><em>Optionally</em> before the first or after the last method in a class or object
    652 literal (neither encouraged nor discouraged).</li>
    653 <li>As required by other sections of this document (e.g.
    654 <a href="#file-goog-require">??</a>).</li>
    655 </ol>
    656 
    657 <p><em>Multiple</em> consecutive blank lines are permitted, but never required (nor
    658 encouraged).</p>
    659 
    660 <h4 id="formatting-horizontal-whitespace">4.6.2 Horizontal whitespace</h4>
    661 
    662 <p>Use of horizontal whitespace depends on location, and falls into three broad
    663 categories: <em>leading</em> (at the start of a line), <em>trailing</em> (at the end of a
    664 line), and <em>internal</em>.  Leading whitespace (i.e., indentation) is addressed
    665 elsewhere.  Trailing whitespace is forbidden.</p>
    666 
    667 <p>Beyond where required by the language or other style rules, and apart from
    668 literals, comments, and JSDoc, a single internal ASCII space also appears in the
    669 following places <strong>only</strong>.</p>
    670 
    671 <ol>
    672 <li>Separating any reserved word (such as <code>if</code>, <code>for</code>, or <code>catch</code>) from an open
    673 parenthesis (<code>(</code>) that follows it on that line.</li>
    674 <li>Separating any reserved word (such as <code>else</code> or <code>catch</code>) from a closing
    675 curly brace (<code>}</code>) that precedes it on that line.</li>
    676 <li>Before any open curly brace (<code>{</code>), with two exceptions:
    677 <ol>
    678 <li>Before an object literal that is the first argument of a function or the
    679 first element in an array literal (e.g. <code>foo({a: [{c: d}]})</code>).</li>
    680 <li>In a template expansion, as it is forbidden by the language
    681 (e.g. <code>abc${1 + 2}def</code>).</li>
    682 </ol></li>
    683 <li>On both sides of any binary or ternary operator.</li>
    684 <li>After a comma (<code>,</code>) or semicolon (<code>;</code>). Note that spaces are <em>never</em> allowed
    685 before these characters.</li>
    686 <li>After the colon (<code>:</code>) in an object literal.</li>
    687 <li>On both sides of the double slash (<code>//</code>) that begins an end-of-line
    688 comment. Here, multiple spaces are allowed, but not required.</li>
    689 <li>After an open-JSDoc comment character and on both sides of close characters
    690 (e.g. for short-form type declarations or casts: <code>this.foo = /** @type
    691 {number} */ (bar);</code> or <code>function(/** string */ foo) {</code>).</li>
    692 </ol>
    693 
    694 <h4 id="formatting-horizontal-alignment">4.6.3 Horizontal alignment: discouraged</h4>
    695 
    696 <p><strong>Terminology Note</strong>: <em>Horizontal alignment</em> is the practice of adding a
    697 variable number of additional spaces in your code with the goal of making
    698 certain tokens appear directly below certain other tokens on previous lines.</p>
    699 
    700 <p>This practice is permitted, but it is <strong>generally discouraged</strong> by Google
    701 Style. It is not even required to <em>maintain</em> horizontal alignment in places
    702 where it was already used.</p>
    703 
    704 <p>Here is an example without alignment, followed by one with alignment.  Both are
    705 allowed, but the latter is discouraged:</p>
    706 
    707 <pre><code class="language-js prettyprint">{
    708   tiny: 42, // this is great
    709   longer: 435, // this too
    710 };
    711 
    712 {
    713   tiny:   42,  // permitted, but future edits
    714   longer: 435, // may leave it unaligned
    715 };
    716 </code></pre>
    717 
    718 <p>Tip: Alignment can aid readability, but it creates problems for future
    719 maintenance. Consider a future change that needs to touch just one line. This
    720 change may leave the formerly-pleasing formatting mangled, and that is
    721 allowed. More often it prompts the coder (perhaps you) to adjust whitespace on
    722 nearby lines as well, possibly triggering a cascading series of
    723 reformattings. That one-line change now has a <q>blast radius.</q> This can at worst
    724 result in pointless busywork, but at best it still corrupts version history
    725 information, slows down reviewers and exacerbates merge conflicts.</p>
    726 
    727 <h4 id="formatting-function-arguments">4.6.4 Function arguments</h4>
    728 
    729 <p>Prefer to put all function arguments on the same line as the function name. If doing so would exceed the 80-column limit, the arguments must be line-wrapped in a readable way. To save space, you may wrap as close to 80 as possible, or put each argument on its own line to enhance readability. Indentation should be four spaces. Aligning to the parenthesis is allowed, but discouraged. Below are the most common patterns for argument wrapping:</p>
    730 
    731 <pre><code class="language-js prettyprint">// Arguments start on a new line, indented four spaces. Preferred when the
    732 // arguments don't fit on the same line with the function name (or the keyword
    733 // "function") but fit entirely on the second line. Works with very long
    734 // function names, survives renaming without reindenting, low on space.
    735 doSomething(
    736     descriptiveArgumentOne, descriptiveArgumentTwo, descriptiveArgumentThree) {
    737   // &#8230;
    738 }
    739 
    740 // If the argument list is longer, wrap at 80. Uses less vertical space,
    741 // but violates the rectangle rule and is thus not recommended.
    742 doSomething(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo,
    743     tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) {
    744   // &#8230;
    745 }
    746 
    747 // Four-space, one argument per line.  Works with long function names,
    748 // survives renaming, and emphasizes each argument.
    749 doSomething(
    750     veryDescriptiveArgumentNumberOne,
    751     veryDescriptiveArgumentTwo,
    752     tableModelEventHandlerProxy,
    753     artichokeDescriptorAdapterIterator) {
    754   // &#8230;
    755 }
    756 </code></pre>
    757 
    758 <h3 id="formatting-grouping-parentheses">4.7 Grouping parentheses: recommended</h3>
    759 
    760 <p>Optional grouping parentheses are omitted only when the author and reviewer
    761 agree that there is no reasonable chance that the code will be misinterpreted
    762 without them, nor would they have made the code easier to read. It is <em>not</em>
    763 reasonable to assume that every reader has the entire operator precedence table
    764 memorized.</p>
    765 
    766 <p>Do not use unnecessary parentheses around the entire expression following
    767 <code>delete</code>, <code>typeof</code>, <code>void</code>, <code>return</code>, <code>throw</code>, <code>case</code>, <code>in</code>, <code>of</code>, or <code>yield</code>.</p>
    768 
    769 <p>Parentheses are required for type casts: <code>/** @type {!Foo} */ (foo)</code>.</p>
    770 
    771 <h3 id="formatting-comments">4.8 Comments</h3>
    772 
    773 <p>This section addresses <em>implementation comments</em>. JSDoc is addressed separately
    774 in <a href="#jsdoc">??</a>.</p>
    775 
    776 <h4 id="formatting-block-comment-style">4.8.1 Block comment style</h4>
    777 
    778 <p>Block comments are indented at the same level as the surrounding code. They may
    779 be in <code>/* &#8230; */</code> or <code>//</code>-style. For multi-line <code>/* &#8230; */</code> comments, subsequent
    780 lines must start with * aligned with the <code>*</code> on the previous line, to make
    781 comments obvious with no extra context.  &#8220;Parameter name&#8221; comments should appear
    782 after values whenever the value and method name do not sufficiently convey the
    783 meaning.</p>
    784 
    785 <pre><code class="language-js prettyprint">/*
    786  * This is
    787  * okay.
    788  */
    789 
    790 // And so
    791 // is this.
    792 
    793 /* This is fine, too. */
    794 
    795 someFunction(obviousParam, true /* shouldRender */, 'hello' /* name */);
    796 </code></pre>
    797 
    798 <p>Comments are not enclosed in boxes drawn with asterisks or other characters.</p>
    799 
    800 <p>Do not use JSDoc (<code>/** &#8230; */</code>) for any of the above implementation comments.</p>
    801 
    802 <h2 id="language-features">5 Language features</h2>
    803 
    804 <p>JavaScript includes many dubious (and even dangerous) features.  This section
    805 delineates which features may or may not be used, and any additional constraints
    806 on their use.</p>
    807 
    808 <h3 id="features-local-variable-declarations">5.1 Local variable declarations</h3>
    809 
    810 <h4 id="features-use-const-and-let">5.1.1 Use <code>const</code> and <code>let</code></h4>
    811 
    812 <p>Declare all local variables with either <code>const</code> or <code>let</code>. Use const by default,
    813 unless a variable needs to be reassigned. The <code class="badcode">var</code>
    814 keyword must not be used.</p>
    815 
    816 <h4 id="features-one-variable-per-declaration">5.1.2 One variable per declaration</h4>
    817 
    818 <p>Every local variable declaration declares only one variable: declarations such
    819 as <code class="badcode">let a = 1, b = 2;</code> are not used.</p>
    820 
    821 <h4 id="features-declared-when-needed">5.1.3 Declared when needed, initialized as soon as possible</h4>
    822 
    823 <p>Local variables are <strong>not</strong> habitually declared at the start of their containing
    824 block or block-like construct. Instead, local variables are declared close to
    825 the point they are first used (within reason), to minimize their scope.</p>
    826 
    827 <h4 id="features-declare-types-as-needed">5.1.4 Declare types as needed</h4>
    828 
    829 <p>JSDoc type annotations may be added either on the line above the declaration, or
    830 else inline before the variable name.</p>
    831 
    832 <p>Example:</p>
    833 
    834 <pre><code class="language-js prettyprint">const /** !Array&lt;number&gt; */ data = [];
    835 
    836 /** @type {!Array&lt;number&gt;} */
    837 const data = [];
    838 </code></pre>
    839 
    840 <p>Tip: There are many cases where the compiler can infer a templatized type but
    841 not its parameters.  This is particularly the case when the initializing literal
    842 or constructor call does not include any values of the template parameter type
    843 (e.g., empty arrays, objects, <code>Map</code>s, or <code>Set</code>s), or if the variable is modified
    844 in a closure.  Local variable type annotations are particularly helpful in these
    845 cases since otherwise the compiler will infer the template parameter as unknown.</p>
    846 
    847 <h3 id="features-array-literals">5.2 Array literals</h3>
    848 
    849 <h4 id="features-arrays-trailing-comma">5.2.1 Use trailing commas</h4>
    850 
    851 
    852 
    853 <p>Include a trailing comma whenever there is a line break between the final
    854 element and the closing bracket.</p>
    855 
    856 <p>Example:</p>
    857 
    858 <pre><code class="language-js prettyprint">const values = [
    859   'first value',
    860   'second value',
    861 ];
    862 </code></pre>
    863 
    864 <h4 id="features-arrays-ctor">5.2.2 Do not use the variadic <code>Array</code> constructor</h4>
    865 
    866 <p>The constructor is error-prone if arguments are added or removed. Use a literal
    867 instead.</p>
    868 
    869 <p>Illegal:</p>
    870 
    871 <pre><code class="language-js prettyprint badcode">const a1 = new Array(x1, x2, x3);
    872 const a2 = new Array(x1, x2);
    873 const a3 = new Array(x1);
    874 const a4 = new Array();
    875 </code></pre>
    876 
    877 <p>This works as expected except for the third case: if <code>x1</code> is a whole number then
    878 <code>a3</code> is an array of size <code>x1</code> where all elements are <code>undefined</code>. If <code>x1</code> is any
    879 other number, then an exception will be thrown, and if it is anything else then
    880 it will be a single-element array.</p>
    881 
    882 <p>Instead, write</p>
    883 
    884 <pre><code class="language-js prettyprint">const a1 = [x1, x2, x3];
    885 const a2 = [x1, x2];
    886 const a3 = [x1];
    887 const a4 = [];
    888 </code></pre>
    889 
    890 <p>Explicitly allocating an array of a given length using <code>new Array(length)</code> is
    891 allowed when appropriate.</p>
    892 
    893 <h4 id="features-arrays-non-numeric-properties">5.2.3 Non-numeric properties</h4>
    894 
    895 <p>Do not define or use non-numeric properties on an array (other than
    896 <code>length</code>). Use a <code>Map</code> (or <code>Object</code>) instead.</p>
    897 
    898 <h4 id="features-arrays-destructuring">5.2.4 Destructuring</h4>
    899 
    900 <p>Array literals may be used on the left-hand side of an assignment to perform
    901 destructuring (such as when unpacking multiple values from a single array or
    902 iterable).  A final <q>rest</q> element may be included (with no space between the
    903 <code>...</code> and the variable name). Elements should be omitted if they are unused.</p>
    904 
    905 <pre><code class="language-js prettyprint">const [a, b, c, ...rest] = generateResults();
    906 let [, b,, d] = someArray;
    907 </code></pre>
    908 
    909 <p>Destructuring may also be used for function parameters (note that a parameter
    910 name is required but ignored). Always specify <code>[]</code> as the default value if a
    911 destructured array parameter is optional, and provide default values on the left
    912 hand side:</p>
    913 
    914 <pre><code class="language-js prettyprint">/** @param {!Array&lt;number&gt;=} param1 */
    915 function optionalDestructuring([a = 4, b = 2] = []) { &#8230; };
    916 </code></pre>
    917 
    918 <p>Illegal:</p>
    919 
    920 <pre><code class="language-js prettyprint badcode">function badDestructuring([a, b] = [4, 2]) { &#8230; };
    921 </code></pre>
    922 
    923 <p>Tip: For (un)packing multiple values into a function&#8217;s parameter or return,
    924 prefer object destructuring to array destructuring when possible, as it allows
    925 naming the individual elements and specifying a different type for each.*</p>
    926 
    927 <h4 id="features-arrays-spread-operator">5.2.5 Spread operator</h4>
    928 
    929 <p>Array literals may include the spread operator (<code>...</code>) to flatten elements out
    930 of one or more other iterables.  The spread operator should be used instead of
    931 more awkward constructs with <code>Array.prototype</code>.  There is no space after the
    932 <code>...</code>.</p>
    933 
    934 <p>Example:</p>
    935 
    936 <pre><code class="language-js prettyprint">[...foo]   // preferred over Array.prototype.slice.call(foo)
    937 [...foo, ...bar]   // preferred over foo.concat(bar)
    938 </code></pre>
    939 
    940 <h3 id="features-object-literals">5.3 Object literals</h3>
    941 
    942 <h4 id="features-objects-use-trailing-comma">5.3.1 Use trailing commas</h4>
    943 
    944 <p>Include a trailing comma whenever there is a line break between the final
    945 property and the closing brace.</p>
    946 
    947 <h4 id="features-objects-ctor">5.3.2 Do not use the <code>Object</code> constructor</h4>
    948 
    949 <p>While <code>Object</code> does not have the same problems as <code>Array</code>, it is still
    950 disallowed for consistency. Use an object literal (<code>{}</code> or <code>{a: 0, b: 1, c: 2}</code>)
    951 instead.</p>
    952 
    953 <h4 id="features-objects-mixing-keys">5.3.3 Do not mix quoted and unquoted keys</h4>
    954 
    955 <p>Object literals may represent either <em>structs</em> (with unquoted keys and/or
    956 symbols) or <em>dicts</em> (with quoted and/or computed keys). Do not mix these key
    957 types in a single object literal.</p>
    958 
    959 <p>Illegal:</p>
    960 
    961 <pre><code class="language-js prettyprint badcode">{
    962   a: 42, // struct-style unquoted key
    963   'b': 43, // dict-style quoted key
    964 }
    965 </code></pre>
    966 
    967 <h4 id="features-objects-computed-property-names">5.3.4 Computed property names</h4>
    968 
    969 <p>Computed property names (e.g., <code>{['key' + foo()]: 42}</code>) are allowed, and are
    970 considered dict-style (quoted) keys (i.e., must not be mixed with non-quoted
    971 keys) unless the computed property is a symbol (e.g., <code>[Symbol.iterator]</code>).
    972 Enum values may also be used for computed keys, but should not be mixed with
    973 non-enum keys in the same literal.</p>
    974 
    975 <h4 id="features-objects-method-shorthand">5.3.5 Method shorthand</h4>
    976 
    977 <p>Methods can be defined on object literals using the method shorthand (<code>{method()
    978 {&#8230; }}</code>) in place of a colon immediately followed by a <code>function</code> or arrow
    979 function literal.</p>
    980 
    981 <p>Example:</p>
    982 
    983 <pre><code class="language-js prettyprint">return {
    984   stuff: 'candy',
    985   method() {
    986     return this.stuff;  // Returns 'candy'
    987   },
    988 };
    989 </code></pre>
    990 
    991 <p>Note that <code>this</code> in a method shorthand or <code>function</code> refers to the object
    992 literal itself whereas <code>this</code> in an arrow function refers to the scope outside
    993 the object literal.</p>
    994 
    995 <p>Example:</p>
    996 
    997 <pre><code class="language-js prettyprint">class {
    998   getObjectLiteral() {
    999     this.stuff = 'fruit';
   1000     return {
   1001       stuff: 'candy',
   1002       method: () =&gt; this.stuff,  // Returns 'fruit'
   1003     };
   1004   }
   1005 }
   1006 </code></pre>
   1007 
   1008 <h4 id="features-objects-shorthand-properties">5.3.6 Shorthand properties</h4>
   1009 
   1010 <p>Shorthand properties are allowed on object literals.</p>
   1011 
   1012 <p>Example:</p>
   1013 
   1014 <pre><code class="language-js prettyprint">const foo = 1;
   1015 const bar = 2;
   1016 const obj = {
   1017   foo,
   1018   bar,
   1019   method() { return this.foo + this.bar; },
   1020 };
   1021 assertEquals(3, obj.method());
   1022 </code></pre>
   1023 
   1024 <h4 id="features-objects-destructuring">5.3.7 Destructuring</h4>
   1025 
   1026 <p>Object destructuring patterns may be used on the left-hand side of an assignment
   1027 to perform destructuring and unpack multiple values from a single object.</p>
   1028 
   1029 <p>Destructured objects may also be used as function parameters, but should be kept
   1030 as simple as possible: a single level of unquoted shorthand properties. Deeper
   1031 levels of nesting and computed properties may not be used in parameter
   1032 destructuring.  Specify any default values in the left-hand-side of the
   1033 destructured parameter (<code>{str = 'some default'} = {}</code>, rather than <code class="badcode">{str} = {str: 'some default'}</code>), and if a destructured
   1034 object is itself optional, it must default to <code>{}</code>.  The JSDoc for the
   1035 destructured parameter may be given any name (the name is unused but is required
   1036 by the compiler).</p>
   1037 
   1038 <p>Example:</p>
   1039 
   1040 <pre><code class="language-js prettyprint">/**
   1041  * @param {string} ordinary
   1042  * @param {{num: (number|undefined), str: (string|undefined)}=} param1
   1043  *     num: The number of times to do something.
   1044  *     str: A string to do stuff to.
   1045  */
   1046 function destructured(ordinary, {num, str = 'some default'} = {})
   1047 </code></pre>
   1048 
   1049 <p>Illegal:</p>
   1050 
   1051 <pre><code class="language-js prettyprint badcode">/** @param {{x: {num: (number|undefined), str: (string|undefined)}}} param1 */
   1052 function nestedTooDeeply({x: {num, str}}) {};
   1053 /** @param {{num: (number|undefined), str: (string|undefined)}=} param1 */
   1054 function nonShorthandProperty({num: a, str: b} = {}) {};
   1055 /** @param {{a: number, b: number}} param1 */
   1056 function computedKey({a, b, [a + b]: c}) {};
   1057 /** @param {{a: number, b: string}=} param1 */
   1058 function nontrivialDefault({a, b} = {a: 2, b: 4}) {};
   1059 </code></pre>
   1060 
   1061 <p>Destructuring may also be used for <code>goog.require</code> statements, and in this case
   1062 must not be wrapped: the entire statement occupies one line, regardless of how
   1063 long it is (see <a href="#file-goog-require">??</a>).</p>
   1064 
   1065 <h4 id="features-objects-enums">5.3.8 Enums</h4>
   1066 
   1067 <p>Enumerations are defined by adding the <code>@enum</code> annotation to an object literal.
   1068 Additional properties may not be added to an enum after it is defined.  Enums
   1069 must be constant, and all enum values must be deeply immutable.</p>
   1070 
   1071 <pre><code class="language-js prettyprint">/**
   1072  * Supported temperature scales.
   1073  * @enum {string}
   1074  */
   1075 const TemperatureScale = {
   1076   CELSIUS: 'celsius',
   1077   FAHRENHEIT: 'fahrenheit',
   1078 };
   1079 
   1080 /**
   1081  * An enum with two options.
   1082  * @enum {number}
   1083  */
   1084 const Option = {
   1085   /** The option used shall have been the first. */
   1086   FIRST_OPTION: 1,
   1087   /** The second among two options. */
   1088   SECOND_OPTION: 2,
   1089 };
   1090 </code></pre>
   1091 
   1092 <h3 id="features-classes">5.4 Classes</h3>
   1093 
   1094 <h4 id="features-classes-constructors">5.4.1 Constructors</h4>
   1095 
   1096 <p>Constructors are optional for concrete classes. Subclass constructors must call
   1097 <code>super()</code> before setting any fields or otherwise accessing <code>this</code>.  Interfaces
   1098 must not define a constructor.</p>
   1099 
   1100 <h4 id="features-classes-fields">5.4.2 Fields</h4>
   1101 
   1102 <p>Set all of a concrete object&#8217;s fields (i.e. all properties other than methods)
   1103 in the constructor. Annotate fields that are never reassigned with <code>@const</code>
   1104 (these need not be deeply immutable). Private fields must be annotated with
   1105 <code>@private</code> and their names must end with a trailing underscore. Fields are never
   1106 set on a concrete class' <code>prototype</code>.</p>
   1107 
   1108 <p>Example:</p>
   1109 
   1110 <pre><code class="language-js prettyprint">class Foo {
   1111   constructor() {
   1112     /** @private @const {!Bar} */
   1113     this.bar_ = computeBar();
   1114   }
   1115 }
   1116 </code></pre>
   1117 
   1118 <p>Tip: Properties should never be added to or removed from an instance after the
   1119 constructor is finished, since it significantly hinders VMs&#8217; ability to
   1120 optimize.  If necessary, fields that are initialized later should be explicitly
   1121 set to <code>undefined</code> in the constructor to prevent later shape changes. Adding
   1122 <code>@struct</code> to an object will check that undeclared properties are not
   1123 added/accessed.  Classes have this added by default.</p>
   1124 
   1125 <h4 id="features-classes-computed-properties">5.4.3 Computed properties</h4>
   1126 
   1127 
   1128 
   1129 <p>Computed properties may only be used in classes when the property is a
   1130 symbol. Dict-style properties (that is, quoted or computed non-symbol keys, as
   1131 defined in <a href="#features-objects-mixing-keys">??</a>) are not allowed.  A
   1132 <code>[Symbol.iterator]</code> method should be defined for any classes that are logically
   1133 iterable.  Beyond this, <code>Symbol</code> should be used sparingly.</p>
   1134 
   1135 <p>Tip: be careful of using any other built-in symbols (e.g., <code>Symbol.isConcatSpreadable</code>) as they are not polyfilled by the compiler and will therefore not work in older browsers.</p>
   1136 
   1137 <h4 id="features-classes-static-methods">5.4.4 Static methods</h4>
   1138 
   1139 
   1140 
   1141 <p>Where it does not interfere with readability, prefer module-local functions over
   1142 private static methods.</p>
   1143 
   1144 <p>Static methods should only be called on the base class itself. Static methods
   1145 should not be called on variables containing a dynamic instance that may be
   1146 either the constructor or a subclass constructor (and must be defined with
   1147 <code>@nocollapse</code> if this is done), and must not be called directly on a subclass
   1148 that doesn&#8217;t define the method itself.</p>
   1149 
   1150 <p>Illegal:</p>
   1151 
   1152 <pre><code class="language-js prettyprint badcode">class Base { /** @nocollapse */ static foo() {} }
   1153 class Sub extends Base {}
   1154 function callFoo(cls) { cls.foo(); }  // discouraged: don't call static methods dynamically
   1155 Sub.foo();  // illegal: don't call static methods on subclasses that don't define it themselves
   1156 </code></pre>
   1157 
   1158 <h4 id="features-classes-old-style">5.4.5 Old-style class declarations</h4>
   1159 
   1160 <p>While ES6 classes are preferred, there are cases where ES6 classes may not be
   1161 feasible.  For example:</p>
   1162 
   1163 <ol>
   1164 <li><p>If there exist or will exist subclasses, including frameworks that create
   1165 subclasses, that cannot be immediately changed to use ES6 class syntax. If
   1166 such a class were to use ES6 syntax, all downstream subclasses not using ES6
   1167 class syntax would need to be modified.</p></li>
   1168 <li><p>Frameworks that require a known <code>this</code> value before calling the superclass
   1169 constructor, since constructors with ES6 super classes do not have
   1170 access to the instance <code>this</code> value until the call to <code>super</code> returns.</p></li>
   1171 </ol>
   1172 
   1173 <p>In all other ways the style guide still applies to this code: <code>let</code>, <code>const</code>,
   1174 default parameters, rest, and arrow functions should all be used when
   1175 appropriate.</p>
   1176 
   1177 <p><code>goog.defineClass</code> allows for a class-like definition similar to ES6 class
   1178 syntax:</p>
   1179 
   1180 <pre><code class="language-javascript">let C = goog.defineClass(S, {
   1181   /**
   1182    * @param {string} value
   1183    */
   1184   constructor(value) {
   1185     S.call(this, 2);
   1186     /** @const */
   1187     this.prop = value;
   1188   },
   1189 
   1190   /**
   1191    * @param {string} param
   1192    * @return {number}
   1193    */
   1194   method(param) {
   1195     return 0;
   1196   },
   1197 });
   1198 </code></pre>
   1199 
   1200 <p>Alternatively, while <code>goog.defineClass</code> should be preferred for all new code,
   1201 more traditional syntax is also allowed.</p>
   1202 
   1203 <pre><code class="language-javascript">/**
   1204   * @constructor @extends {S}
   1205   * @param {string} value
   1206   */
   1207 function C(value) {
   1208   S.call(this, 2);
   1209   /** @const */
   1210   this.prop = value;
   1211 }
   1212 goog.inherits(C, S);
   1213 
   1214 /**
   1215  * @param {string} param
   1216  * @return {number}
   1217  */
   1218 C.prototype.method = function(param) {
   1219   return 0;
   1220 };
   1221 </code></pre>
   1222 
   1223 <p>Per-instance properties should be defined in the constructor after the call to the super class constructor, if there is a super class.  Methods should be defined on the prototype of the constructor.</p>
   1224 
   1225 <p>Defining constructor prototype hierarchies correctly is harder than it first appears!  For that reason, it is best to use <code>goog.inherits</code> from <a href="http://code.google.com/closure/library/">the Closure Library </a>.</p>
   1226 
   1227 <h4 id="features-classes-prototypes">5.4.6 Do not manipulate <code>prototype</code>s directly</h4>
   1228 
   1229 <p>The <code>class</code> keyword allows clearer and more readable class definitions than
   1230 defining <code>prototype</code> properties. Ordinary implementation code has no business
   1231 manipulating these objects, though they are still useful for defining <code>@record</code>
   1232 interfaces and classes as defined in <a href="#features-classes-old-style">??</a>. Mixins
   1233 and modifying the prototypes of builtin objects are
   1234 explicitly forbidden.</p>
   1235 
   1236 <p><strong>Exception</strong>: Framework code (such as Polymer, or Angular) may need to use <code>prototype</code>s, and should not
   1237 resort to even-worse workarounds to avoid doing so.</p>
   1238 
   1239 <p><strong>Exception</strong>: Defining fields in interfaces (see <a href="#features-classes-interfaces">??</a>).</p>
   1240 
   1241 <h4 id="features-classes-getters-and-setters">5.4.7 Getters and Setters</h4>
   1242 
   1243 <p>Do not use <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get">JavaScript getter and setter properties</a>.  They are potentially
   1244 surprising and difficult to reason about, and have limited support in the
   1245 compiler.  Provide ordinary methods instead.</p>
   1246 
   1247 <p><strong>Exception</strong>: when working with data binding frameworks (such as Angular and
   1248 Polymer), getters and setters may be used sparingly.  Note, however, that
   1249 compiler support is limited.  When they are used, they must be defined either
   1250 with <code>get foo()</code> and <code>set foo(value)</code> in the class or object literal, or if that
   1251 is not possible, with <code>Object.defineProperties</code>.  Do not use
   1252 <code>Object.defineProperty</code>, which interferes with property renaming.  Getters
   1253 <strong>must not</strong> change observable state.</p>
   1254 
   1255 <p>Illegal:</p>
   1256 
   1257 <pre><code class="language-js prettyprint badcode">class Foo {
   1258   get next() { return this.nextId++; }
   1259 }
   1260 </code></pre>
   1261 
   1262 <h4 id="features-classes-overriding-tostring">5.4.8 Overriding toString</h4>
   1263 
   1264 <p>The <code>toString</code> method may be overridden, but must always succeed and never have
   1265 visible side effects.</p>
   1266 
   1267 <p>Tip: Beware, in particular, of calling other methods from toString, since
   1268 exceptional conditions could lead to infinite loops.</p>
   1269 
   1270 <h4 id="features-classes-interfaces">5.4.9 Interfaces</h4>
   1271 
   1272 <p>Interfaces may be declared with <code>@interface</code> or <code>@record</code>. Interfaces declared
   1273 with <code>@record</code> can be explicitly (i.e. via <code>@implements</code>) or implicitly
   1274 implemented by a class or object literal.</p>
   1275 
   1276 <p>All non-static method bodies on an interface must be empty blocks.  Fields must
   1277 be defined after the interface body as stubs on the <code>prototype</code>.</p>
   1278 
   1279 <p>Example:</p>
   1280 
   1281 <pre><code class="language-js prettyprint">/**
   1282  * Something that can frobnicate.
   1283  * @record
   1284  */
   1285 class Frobnicator {
   1286   /**
   1287    * Performs the frobnication according to the given strategy.
   1288    * @param {!FrobnicationStrategy} strategy
   1289    */
   1290   frobnicate(strategy) {}
   1291 }
   1292 
   1293 /** @type {number} The number of attempts before giving up. */
   1294 Frobnicator.prototype.attempts;
   1295 </code></pre>
   1296 
   1297 <h3 id="features-functions">5.5 Functions</h3>
   1298 
   1299 <h4 id="features-functions-top-level-functions">5.5.1 Top-level functions</h4>
   1300 
   1301 <p>Exported functions may be defined directly on the <code>exports</code> object, or else
   1302 declared locally and exported separately.  Non-exported functions are encouraged
   1303 and should not be declared <code>@private</code>.</p>
   1304 
   1305 <p>Examples:</p>
   1306 
   1307 <pre><code class="language-js prettyprint">/** @return {number} */
   1308 function helperFunction() {
   1309   return 42;
   1310 }
   1311 /** @return {number} */
   1312 function exportedFunction() {
   1313   return helperFunction() * 2;
   1314 }
   1315 /**
   1316  * @param {string} arg
   1317  * @return {number}
   1318  */
   1319 function anotherExportedFunction(arg) {
   1320   return helperFunction() / arg.length;
   1321 }
   1322 /** @const */
   1323 exports = {exportedFunction, anotherExportedFunction};
   1324 </code></pre>
   1325 
   1326 <pre><code class="language-js prettyprint">/** @param {string} arg */
   1327 exports.foo = (arg) =&gt; {
   1328   // do some stuff ...
   1329 };
   1330 </code></pre>
   1331 
   1332 <h4 id="features-functions-nested-functions">5.5.2 Nested functions and closures</h4>
   1333 
   1334 <p>Functions may contain nested function definitions.  If it is useful to give the
   1335 function a name, it should be assigned to a local <code>const</code>.</p>
   1336 
   1337 <h4 id="features-functions-arrow-functions">5.5.3 Arrow functions</h4>
   1338 
   1339 <p>Arrow functions provide a concise syntax and fix a number of difficulties with
   1340 <code>this</code>.  Prefer arrow functions over the <code>function</code> keyword, particularly for
   1341 nested functions (but see <a href="#features-objects-method-shorthand">??</a>).</p>
   1342 
   1343 <p>Prefer using arrow functions over <code>f.bind(this)</code>, and especially over
   1344 <code>goog.bind(f, this)</code>. Avoid writing <code>const self = this</code>. Arrow functions are
   1345 particularly useful for callbacks, which sometimes pass unexpected additional
   1346 arguments.</p>
   1347 
   1348 <p>The right-hand side of the arrow may be a single expression or a block.
   1349 Parentheses around the arguments are optional if there is only a single
   1350 non-destructured argument.</p>
   1351 
   1352 <p>Tip: It is a good practice to use parentheses even for single-argument arrows,
   1353 since the code may still parse reasonably (but incorrectly) if the parentheses
   1354 are forgotten when an additional argument is added.</p>
   1355 
   1356 <h4 id="features-functions-generators">5.5.4 Generators</h4>
   1357 
   1358 <p>Generators enable a number of useful abstractions and may be used as needed.</p>
   1359 
   1360 <p>When defining generator functions, attach the <code>*</code> to the <code>function</code> keyword when
   1361 present, and separate it with a space from the name of the function.  When using
   1362 delegating yields, attach the <code>*</code> to the <code>yield</code> keyword.</p>
   1363 
   1364 <p>Example:</p>
   1365 
   1366 <pre><code class="language-js prettyprint">/** @return {!Iterator&lt;number&gt;} */
   1367 function* gen1() {
   1368   yield 42;
   1369 }
   1370 
   1371 /** @return {!Iterator&lt;number&gt;} */
   1372 const gen2 = function*() {
   1373   yield* gen1();
   1374 }
   1375 
   1376 class SomeClass {
   1377   /** @return {!Iterator&lt;number&gt;} */
   1378   * gen() {
   1379     yield 42;
   1380   }
   1381 }
   1382 </code></pre>
   1383 
   1384 <h4 id="features-functions-parameters">5.5.5 Parameters</h4>
   1385 
   1386 <p>Function parameters must be typed with JSDoc annotations in the JSDoc preceding
   1387 the function&#8217;s definition, except in the case of same-signature <code>@override</code>s,
   1388 where all types are omitted.</p>
   1389 
   1390 <p>Parameter types <em>may</em> be specified inline, immediately before the parameter name
   1391 (as in <code>(/** number */ foo, /** string */ bar) =&gt; foo + bar</code>). Inline and
   1392 <code>@param</code> type annotations <em>must not</em> be mixed in the same function definition.</p>
   1393 
   1394 <h5 id="features-functions-default-parameters">5.5.5.1 Default parameters</h5>
   1395 
   1396 <p>Optional parameters are permitted using the equals operator in the parameter
   1397 list. Optional parameters must include spaces on both sides of the equals
   1398 operator, be named exactly like required parameters (i.e., not prefixed with
   1399 <code>opt_</code>), use the <code>=</code> suffix in their JSDoc type, come after required parameters,
   1400 and not use initializers that produce observable side effects. All optional
   1401 parameters must have a default value in the function declaration, even if that
   1402 value is <code>undefined</code>.</p>
   1403 
   1404 <p>Example:</p>
   1405 
   1406 <pre><code class="language-js prettyprint">/**
   1407  * @param {string} required This parameter is always needed.
   1408  * @param {string=} optional This parameter can be omitted.
   1409  * @param {!Node=} node Another optional parameter.
   1410  */
   1411 function maybeDoSomething(required, optional = '', node = undefined) {}
   1412 </code></pre>
   1413 
   1414 <p>Use default parameters sparingly. Prefer destructuring (as in
   1415 <a href="#features-objects-destructuring">??</a>) to create readable APIs when there
   1416 are more than a small handful of optional parameters that do not have a natural
   1417 order.</p>
   1418 
   1419 <p>Note: Unlike Python's default parameters, it is okay to use initializers that
   1420 return new mutable objects (such as <code>{}</code> or <code>[]</code>) because the initializer is
   1421 evaluated each time the default value is used, so a single object won't be
   1422 shared across invocations.</p>
   1423 
   1424 <p>Tip: While arbitrary expressions including function calls may be used as
   1425 initializers, these should be kept as simple as possible. Avoid initializers
   1426 that expose shared mutable state, as that can easily introduce unintended
   1427 coupling between function calls.</p>
   1428 
   1429 <h5 id="features-functions-rest-parameters">5.5.5.2 Rest parameters</h5>
   1430 
   1431 <p>Use a <em>rest</em> parameter instead of accessing <code>arguments</code>. Rest parameters are
   1432 typed with a <code>...</code> prefix in their JSDoc. The rest parameter must be the last
   1433 parameter in the list. There is no space between the <code>...</code> and the parameter
   1434 name.  Do not name the rest parameter <code>var_args</code>. Never name a local variable or
   1435 parameter <code>arguments</code>, which confusingly shadows the built-in name.</p>
   1436 
   1437 <p>Example:</p>
   1438 
   1439 <pre><code class="language-js prettyprint">/**
   1440  * @param {!Array&lt;string&gt;} array This is an ordinary parameter.
   1441  * @param {...number} numbers The remainder of arguments are all numbers.
   1442  */
   1443 function variadic(array, ...numbers) {}
   1444 </code></pre>
   1445 
   1446 <h4 id="features-functions-returns">5.5.6 Returns</h4>
   1447 
   1448 <p>Function return types must be specified in the JSDoc directly above the function
   1449 definition, except in the case of same-signature <code>@override</code>s where all types
   1450 are omitted.</p>
   1451 
   1452 <h4 id="features-functions-generics">5.5.7 Generics</h4>
   1453 
   1454 <p>Declare generic functions and methods when necessary with <code>@template TYPE</code> in
   1455 the JSDoc above the class definition.</p>
   1456 
   1457 <h4 id="features-functions-spread-operator">5.5.8 Spread operator</h4>
   1458 
   1459 <p>Function calls may use the spread operator (<code>...</code>).  Prefer the spread operator
   1460 to <code>Function.prototype.apply</code> when an array or iterable is unpacked into
   1461 multiple parameters of a variadic function.  There is no space after the <code>...</code>.</p>
   1462 
   1463 <p>Example:</p>
   1464 
   1465 <pre><code class="language-js prettyprint">function myFunction(...elements) {}
   1466 myFunction(...array, ...iterable, ...generator());
   1467 </code></pre>
   1468 
   1469 <h3 id="features-string-literals">5.6 String literals</h3>
   1470 
   1471 <h4 id="features-strings-use-single-quotes">5.6.1 Use single quotes</h4>
   1472 
   1473 <p>Ordinary string literals are delimited with single quotes (<code>'</code>), rather than
   1474 double quotes (<code>"</code>).</p>
   1475 
   1476 <p>Tip: if a string contains a single quote character, consider using a template
   1477 string to avoid having to escape the quote.</p>
   1478 
   1479 <p>Ordinary string literals may not span multiple lines.</p>
   1480 
   1481 <h4 id="features-strings-template-strings">5.6.2 Template strings</h4>
   1482 
   1483 <p>Use template strings (delimited with <code>`</code>) over complex string
   1484 concatenation, particularly if multiple string literals are involved. Template
   1485 strings may span multiple lines.</p>
   1486 
   1487 <p>If a template string spans multiple lines, it does not need to follow the
   1488 indentation of the enclosing block, though it may if the added whitespace does
   1489 not matter.</p>
   1490 
   1491 <p>Example:</p>
   1492 
   1493 <pre><code class="language-js prettyprint">function arithmetic(a, b) {
   1494   return `Here is a table of arithmetic operations:
   1495 ${a} + ${b} = ${a + b}
   1496 ${a} - ${b} = ${a - b}
   1497 ${a} * ${b} = ${a * b}
   1498 ${a} / ${b} = ${a / b}`;
   1499 }
   1500 </code></pre>
   1501 
   1502 <h4 id="features-strings-no-line-continuations">5.6.3 No line continuations</h4>
   1503 
   1504 <p>Do not use <em>line continuations</em> (that is, ending a line inside a string literal
   1505 with a backslash) in either ordinary or template string literals. Even though
   1506 ES5 allows this, it can lead to tricky errors if any trailing whitespace comes
   1507 after the slash, and is less obvious to readers.</p>
   1508 
   1509 <p>Illegal:</p>
   1510 
   1511 <pre><code class="language-js prettyprint badcode">const longString = 'This is a very long string that far exceeds the 80 \
   1512     column limit. It unfortunately contains long stretches of spaces due \
   1513     to how the continued lines are indented.';
   1514 </code></pre>
   1515 
   1516 <p>Instead, write</p>
   1517 
   1518 <pre><code class="language-js prettyprint">const longString = 'This is a very long string that far exceeds the 80 ' +
   1519     'column limit. It does not contain long stretches of spaces since ' +
   1520     'the concatenated strings are cleaner.';
   1521 </code></pre>
   1522 
   1523 <h3 id="features-number-literals">5.7 Number literals</h3>
   1524 
   1525 <p>Numbers may be specified in decimal, hex, octal, or binary.  Use exactly <code>0x</code>,
   1526 <code>0o</code>, and <code>0b</code> prefixes, with lowercase letters, for hex, octal, and binary,
   1527 respectively.  Never include a leading zero unless it is immediately followed by
   1528 <code>x</code>, <code>o</code>, or <code>b</code>.</p>
   1529 
   1530 <h3 id="features-control-structures">5.8 Control structures</h3>
   1531 
   1532 <h4 id="features-for-loops">5.8.1 For loops</h4>
   1533 
   1534 <p>With ES6, the language now has three different kinds of <code>for</code> loops.  All may be
   1535 used, though <code>for</code>-<code>of</code> loops should be preferred when possible.</p>
   1536 
   1537 <p><code>for</code>-<code>in</code> loops may only be used on dict-style objects (see
   1538 <a href="#features-objects-mixing-keys">??</a>), and should not be used to iterate over an
   1539 array.  <code>Object.prototype.hasOwnProperty</code> should be used in <code>for</code>-<code>in</code> loops to
   1540 exclude unwanted prototype properties.  Prefer <code>for</code>-<code>of</code> and <code>Object.keys</code> over
   1541 <code>for</code>-<code>in</code> when possible.</p>
   1542 
   1543 <h4 id="features-exceptions">5.8.2 Exceptions</h4>
   1544 
   1545 <p>Exceptions are an important part of the language and should be used whenever
   1546 exceptional cases occur.  Always throw <code>Error</code>s or subclasses of <code>Error</code>: never
   1547 throw string literals or other objects.  Always use <code>new</code> when constructing an
   1548 <code>Error</code>.</p>
   1549 
   1550 <p>Custom exceptions provide a great way to convey additional error information
   1551 from functions.  They should be defined and used wherever the native <code>Error</code>
   1552 type is insufficient.</p>
   1553 
   1554 <p>Prefer throwing exceptions over ad-hoc error-handling approaches (such as
   1555 passing an error container reference type, or returning an object with an error
   1556 property).</p>
   1557 
   1558 <h5 id="features-empty-catch-blocks">5.8.2.1 Empty catch blocks</h5>
   1559 
   1560 <p>It is very rarely correct to do nothing in response to a caught exception. When
   1561 it truly is appropriate to take no action whatsoever in a catch block, the
   1562 reason this is justified is explained in a comment.</p>
   1563 
   1564 <pre><code class="language-js prettyprint">try {
   1565   return handleNumericResponse(response);
   1566 } catch (ok) {
   1567   // it's not numeric; that's fine, just continue
   1568 }
   1569 return handleTextResponse(response);
   1570 </code></pre>
   1571 
   1572 <p>Illegal:</p>
   1573 
   1574 <pre><code class="language-js prettyprint badcode">   try {
   1575     shouldFail();
   1576     fail('expected an error');
   1577   }
   1578   catch (expected) {}
   1579 </code></pre>
   1580 
   1581 <p>Tip: Unlike in some other languages, patterns like the above simply don&#8217;t work
   1582 since this will catch the error thrown by <code>fail</code>. Use <code>assertThrows()</code> instead.</p>
   1583 
   1584 <h4 id="features-switch-statements">5.8.3 Switch statements</h4>
   1585 
   1586 <p>Terminology Note: Inside the braces of a switch block are one or more statement groups. Each statement group consists of one or more switch labels (either <code>case FOO:</code> or <code>default:</code>), followed by one or more statements.</p>
   1587 
   1588 <h5 id="features-switch-fall-through">5.8.3.1 Fall-through: commented</h5>
   1589 
   1590 <p>Within a switch block, each statement group either terminates abruptly (with a
   1591 <code>break</code>, <code>return</code> or <code>throw</code>n exception), or is marked with a comment to
   1592 indicate that execution will or might continue into the next statement
   1593 group. Any comment that communicates the idea of fall-through is sufficient
   1594 (typically <code>// fall through</code>). This special comment is not required in the last
   1595 statement group of the switch block.</p>
   1596 
   1597 <p>Example:</p>
   1598 
   1599 <pre><code class="language-js prettyprint">switch (input) {
   1600   case 1:
   1601   case 2:
   1602     prepareOneOrTwo();
   1603   // fall through
   1604   case 3:
   1605     handleOneTwoOrThree();
   1606     break;
   1607   default:
   1608     handleLargeNumber(input);
   1609 }
   1610 </code></pre>
   1611 
   1612 <h5 id="features-switch-default-case">5.8.3.2 The <code>default</code> case is present</h5>
   1613 
   1614 <p>Each switch statement includes a <code>default</code> statement group, even if it contains
   1615 no code.</p>
   1616 
   1617 <h3 id="features-this">5.9 this</h3>
   1618 
   1619 <p>Only use <code>this</code> in class constructors and methods, or in arrow functions defined
   1620 within class constructors and methods. Any other uses of <code>this</code> must have an
   1621 explicit <code>@this</code> declared in the immediately-enclosing function&#8217;s JSDoc.</p>
   1622 
   1623 <p>Never use <code>this</code> to refer to the global object, the context of an <code>eval</code>, the
   1624 target of an event, or unnecessarily <code>call()</code>ed or <code>apply()</code>ed functions.</p>
   1625 
   1626 <h3 id="disallowed-features">5.10 Disallowed features</h3>
   1627 
   1628 <h4 id="disallowed-features-with">5.10.1 with</h4>
   1629 
   1630 <p>Do not use the <code>with</code> keyword.  It makes your code harder to understand and has
   1631 been banned in strict mode since ES5.</p>
   1632 
   1633 <h4 id="disallowed-features-dynamic-code-evaluation">5.10.2 Dynamic code evaluation</h4>
   1634 
   1635 <p>Do not use <code>eval</code> or the <code>Function(...string)</code> constructor (except for code
   1636 loaders).  These features are potentially dangerous and simply do not work in
   1637 CSP environments.</p>
   1638 
   1639 <h4 id="disallowed-features-automatic-semicolon-insertion">5.10.3 Automatic semicolon insertion</h4>
   1640 
   1641 <p>Always terminate statements with semicolons (except function and class
   1642 declarations, as noted above).</p>
   1643 
   1644 <h4 id="disallowed-features-non-standard-features">5.10.4 Non-standard features</h4>
   1645 
   1646 <p>Do not use non-standard features.  This includes old features that have been
   1647 removed (e.g., <code>WeakMap.clear</code>), new features that are not yet standardized
   1648 (e.g., the current TC39 working draft, proposals at any stage, or proposed but
   1649 not-yet-complete web standards), or proprietary features that are only
   1650 implemented in some browsers.  Use only features defined in the current ECMA-262
   1651 or WHATWG standards.  (Note that projects writing against specific APIs, such as
   1652 Chrome extensions or Node.js, can obviously use those APIs).  Non-standard
   1653 language &#8220;extensions&#8221; (such as those provided by some external transpilers) are
   1654 forbidden.</p>
   1655 
   1656 <h4 id="disallowed-features-wrapper-objects">5.10.5 Wrapper objects for primitive types</h4>
   1657 
   1658 <p>Never use <code>new</code> on the primitive object wrappers (<code>Boolean</code>, <code>Number</code>, <code>String</code>,
   1659 <code>Symbol</code>), nor include them in type annotations.</p>
   1660 
   1661 <p>Illegal:</p>
   1662 
   1663 <pre><code class="language-js prettyprint badcode">const /** Boolean */ x = new Boolean(false);
   1664 if (x) alert(typeof x);  // alerts 'object' - WAT?
   1665 </code></pre>
   1666 
   1667 <p>The wrappers may be called as functions for coercing (which is preferred over
   1668 using <code>+</code> or concatenating the empty string) or creating symbols.</p>
   1669 
   1670 <p>Example:</p>
   1671 
   1672 <pre><code class="language-js prettyprint">const /** boolean */ x = Boolean(0);
   1673 if (!x) alert(typeof x);  // alerts 'boolean', as expected
   1674 </code></pre>
   1675 
   1676 <h4 id="disallowed-features-modifying-builtin-objects">5.10.6 Modifying builtin objects</h4>
   1677 
   1678 <p>Never modify builtin types, either by adding methods to their constructors or to
   1679 their prototypes.  Avoid depending on libraries that do this.  Note that the
   1680 JSCompiler&#8217;s runtime library will provide standards-compliant polyfills where
   1681 possible; nothing else may modify builtin objects.</p>
   1682 
   1683 <p>Do not add symbols to the global object unless absolutely necessary
   1684 (e.g. required by a third-party API).</p>
   1685 
   1686 <h2 id="naming">6 Naming</h2>
   1687 
   1688 <h3 id="naming-rules-common-to-all-identifiers">6.1 Rules common to all identifiers</h3>
   1689 
   1690 <p>Identifiers use only ASCII letters and digits, and, in a small number of cases
   1691 noted below, underscores and very rarely (when required by frameworks like
   1692 Angular) dollar signs.</p>
   1693 
   1694 <p>Give as descriptive a name as possible, within reason. Do not worry about saving
   1695 horizontal space as it is far more important to make your code immediately
   1696 understandable by a new reader. Do not use abbreviations that are ambiguous or
   1697 unfamiliar to readers outside your project, and do not abbreviate by deleting
   1698 letters within a word.</p>
   1699 
   1700 <pre><code class="language-js prettyprint">priceCountReader      // No abbreviation.
   1701 numErrors             // "num" is a widespread convention.
   1702 numDnsConnections     // Most people know what "DNS" stands for.
   1703 </code></pre>
   1704 
   1705 <p>Illegal:</p>
   1706 
   1707 <pre><code class="language-js prettyprint badcode">n                     // Meaningless.
   1708 nErr                  // Ambiguous abbreviation.
   1709 nCompConns            // Ambiguous abbreviation.
   1710 wgcConnections        // Only your group knows what this stands for.
   1711 pcReader              // Lots of things can be abbreviated "pc".
   1712 cstmrId               // Deletes internal letters.
   1713 kSecondsPerDay        // Do not use Hungarian notation.
   1714 </code></pre>
   1715 
   1716 <h3 id="naming-rules-by-identifier-type">6.2 Rules by identifier type</h3>
   1717 
   1718 <h4 id="naming-package-names">6.2.1 Package names</h4>
   1719 
   1720 <p>Package names are all <code>lowerCamelCase</code>. For example,
   1721 <code>my.exampleCode.deepSpace</code>, but not <code class="badcode">my.examplecode.deepspace</code> or <code class="badcode">my.example_code.deep_space</code>.</p>
   1722 
   1723 <h4 id="naming-class-names">6.2.2 Class names</h4>
   1724 
   1725 <p>Class, interface, record, and typedef names are written in <code>UpperCamelCase</code>.
   1726 Unexported classes are simply locals: they are not marked <code>@private</code> and
   1727 therefore are not named with a trailing underscore.</p>
   1728 
   1729 <p>Type names are typically nouns or noun phrases. For example, <code>Request</code>,
   1730 <code>ImmutableList</code>, or <code>VisibilityMode</code>.  Additionally, interface names may
   1731 sometimes be adjectives or adjective phrases instead (for example, <code>Readable</code>).</p>
   1732 
   1733 <h4 id="naming-method-names">6.2.3 Method names</h4>
   1734 
   1735 <p>Method names are written in <code>lowerCamelCase</code>.  Private methods&#8217; names must end
   1736 with a trailing underscore.</p>
   1737 
   1738 <p>Method names are typically verbs or verb phrases. For example, <code>sendMessage</code> or
   1739 <code>stop_</code>.  Getter and setter methods for properties are never required, but if
   1740 they are used they should be named <code>getFoo</code> (or optionally <code>isFoo</code> or <code>hasFoo</code>
   1741 for booleans), or <code>setFoo(value)</code> for setters.</p>
   1742 
   1743 <p>Underscores may also appear in JsUnit test method names to separate logical
   1744 components of the name. One typical pattern is <code>test&lt;MethodUnderTest&gt;_&lt;state&gt;</code>,
   1745 for example <code>testPop_emptyStack</code>. There is no One Correct Way to name test
   1746 methods.</p>
   1747 
   1748 <h4 id="naming-enum-names">6.2.4 Enum names</h4>
   1749 
   1750 <p>Enum names are written in <code>UpperCamelCase</code>, similar to classes, and should
   1751 generally be singular nouns.  Individual items within the enum are named in
   1752 <code>CONSTANT_CASE</code>.</p>
   1753 
   1754 <h4 id="naming-constant-names">6.2.5 Constant names</h4>
   1755 
   1756 <p>Constant names use <code>CONSTANT_CASE</code>: all uppercase letters, with words separated
   1757 by underscores. There is no reason for a constant to be named with a trailing
   1758 underscore, since private static properties can be replaced by (implicitly
   1759 private) module locals.</p>
   1760 
   1761 <h5 id="naming-definition-of-constant">6.2.5.1 Definition of &#8220;constant&#8221;</h5>
   1762 
   1763 <p>Every constant is a <code>@const</code> static property or a module-local <code>const</code>
   1764 declaration, but not all <code>@const</code> static properties and module-local <code>const</code>s
   1765 are constants. Before choosing constant case, consider whether the field really
   1766 feels like a <em>deeply immutable</em> constant. For example, if any of that instance's
   1767 observable state can change, it is almost certainly not a constant. Merely
   1768 intending to never mutate the object is generally not enough.</p>
   1769 
   1770 <p>Examples:</p>
   1771 
   1772 <pre><code class="language-js prettyprint">// Constants
   1773 const NUMBER = 5;
   1774 /** @const */ exports.NAMES = ImmutableList.of('Ed', 'Ann');
   1775 /** @enum */ exports.SomeEnum = { ENUM_CONSTANT: 'value' };
   1776 
   1777 // Not constants
   1778 let letVariable = 'non-const';
   1779 class MyClass { constructor() { /** @const */ this.nonStatic = 'non-static'; } };
   1780 /** @type {string} */ MyClass.staticButMutable = 'not @const, can be reassigned';
   1781 const /** Set&lt;String&gt; */ mutableCollection = new Set();
   1782 const /** ImmutableSet&lt;SomeMutableType&gt; */ mutableElements = ImmutableSet.of(mutable);
   1783 const Foo = goog.require('my.Foo');  // mirrors imported name
   1784 const logger = log.getLogger('loggers.are.not.immutable');
   1785 </code></pre>
   1786 
   1787 <p>Constants&#8217; names are typically nouns or noun phrases.</p>
   1788 
   1789 <h5 id="naming-local-aliases">6.2.5.1 Local aliases</h5>
   1790 
   1791 <p>Local aliases should be used whenever they improve readability over
   1792 fully-qualified names.  Follow the same rules as <code>goog.require</code>s
   1793 (<a href="#file-goog-require">??</a>), maintaining the last part of the aliased name.
   1794 Aliases may also be used within functions.  Aliases must be <code>const</code>.</p>
   1795 
   1796 <p>Examples:</p>
   1797 
   1798 <pre><code class="language-js prettyprint">const staticHelper = importedNamespace.staticHelper;
   1799 const CONSTANT_NAME = ImportedClass.CONSTANT_NAME;
   1800 const {assert, assertInstanceof} = asserts;
   1801 </code></pre>
   1802 
   1803 <h4 id="naming-non-constant-field-names">6.2.6 Non-constant field names</h4>
   1804 
   1805 <p>Non-constant field names (static or otherwise) are written in <code>lowerCamelCase</code>,
   1806 with a trailing underscore for private fields.</p>
   1807 
   1808 <p>These names are typically nouns or noun phrases. For example, <code>computedValues</code>
   1809 or <code>index_</code>.</p>
   1810 
   1811 <h4 id="naming-parameter-names">6.2.7 Parameter names</h4>
   1812 
   1813 <p>Parameter names are written in <code>lowerCamelCase</code>.  Note that this applies even if
   1814 the parameter expects a constructor.</p>
   1815 
   1816 <p>One-character parameter names should not be used in public methods.</p>
   1817 
   1818 <p><strong>Exception</strong>: When required by a third-party framework, parameter names may
   1819 begin with a <code>$</code>.  This exception does not apply to any other identifiers
   1820 (e.g. local variables or properties).</p>
   1821 
   1822 <h4 id="naming-local-variable-names">6.2.8 Local variable names</h4>
   1823 
   1824 <p>Local variable names are written in <code>lowerCamelCase</code>, except for module-local
   1825 (top-level) constants, as described above.  Constants in function scopes are
   1826 still named in <code>lowerCamelCase</code>.  Note that lowerCamelCase applies even if the
   1827 variable holds a constructor.</p>
   1828 
   1829 <h4 id="naming-template-parameter-names">6.2.9 Template parameter names</h4>
   1830 
   1831 <p>Template parameter names should be concise, single-word or single-letter
   1832 identifiers, and must be all-caps, such as <code>TYPE</code> or <code>THIS</code>.</p>
   1833 
   1834 <h3 id="naming-camel-case-defined">6.3 Camel case: defined</h3>
   1835 
   1836 <p>Sometimes there is more than one reasonable way to convert an English phrase
   1837 into camel case, such as when acronyms or unusual constructs like <q>IPv6</q> or
   1838 <q>iOS</q> are present. To improve predictability, Google Style specifies the
   1839 following (nearly) deterministic scheme.</p>
   1840 
   1841 <p>Beginning with the prose form of the name:</p>
   1842 
   1843 <ol>
   1844 <li>Convert the phrase to plain ASCII and remove any apostrophes. For example,
   1845 <q>M&#252;ller's algorithm</q> might become <q>Muellers algorithm</q>.</li>
   1846 <li>Divide this result into words, splitting on spaces and any remaining
   1847 punctuation (typically hyphens).
   1848 <ol>
   1849 <li>Recommended: if any word already has a conventional camel case
   1850 appearance in common usage, split this into its constituent parts (e.g.,
   1851 <q>AdWords</q> becomes <q>ad words</q>). Note that a word such as <q>iOS</q> is not
   1852 really in camel case per se; it defies any convention, so this
   1853 recommendation does not apply.</li>
   1854 </ol></li>
   1855 <li>Now lowercase everything (including acronyms), then uppercase only the first
   1856 character of:
   1857 <ol>
   1858 <li>&#8230; each word, to yield upper camel case, or</li>
   1859 <li>&#8230; each word except the first, to yield lower camel case</li>
   1860 </ol></li>
   1861 <li>Finally, join all the words into a single identifier.</li>
   1862 </ol>
   1863 
   1864 <p>Note that the casing of the original words is almost entirely disregarded.</p>
   1865 
   1866 <p>Examples:</p>
   1867 
   1868 <table>
   1869 <thead>
   1870 <tr>
   1871 <th style="text-align: center">Prose form</th>
   1872 <th style="text-align: center">Correct</th>
   1873 <th style="text-align: center">Incorrect</th>
   1874 </tr>
   1875 </thead>
   1876 
   1877 <tbody>
   1878 <tr>
   1879 <td style="text-align: center"><q>XML HTTP request</q></td>
   1880 <td style="text-align: center">XmlHttpRequest</td>
   1881 <td style="text-align: center">XMLHTTPRequest</td>
   1882 </tr>
   1883 <tr>
   1884 <td style="text-align: center"><q>new customer ID</q></td>
   1885 <td style="text-align: center">newCustomerId</td>
   1886 <td style="text-align: center">newCustomerID</td>
   1887 </tr>
   1888 <tr>
   1889 <td style="text-align: center"><q>inner stopwatch</q></td>
   1890 <td style="text-align: center">innerStopwatch</td>
   1891 <td style="text-align: center">innerStopWatch</td>
   1892 </tr>
   1893 <tr>
   1894 <td style="text-align: center"><q>supports IPv6 on iOS?</q></td>
   1895 <td style="text-align: center">supportsIpv6OnIos</td>
   1896 <td style="text-align: center">supportsIPv6OnIOS</td>
   1897 </tr>
   1898 <tr>
   1899 <td style="text-align: center"><q>YouTube importer</q></td>
   1900 <td style="text-align: center">YouTubeImporter</td>
   1901 <td style="text-align: center">YoutubeImporter*</td>
   1902 </tr>
   1903 </tbody>
   1904 </table>
   1905 
   1906 <p>*Acceptable, but not recommended.</p>
   1907 
   1908 <p>Note: Some words are ambiguously hyphenated in the English language: for example <q>nonempty</q> and <q>non-empty</q> are both correct, so the method names checkNonempty and checkNonEmpty are likewise both correct.</p>
   1909 
   1910 <h2 id="jsdoc">7 JSDoc</h2>
   1911 
   1912 <p><a href="https://developers.google.com/closure/compiler/docs/js-for-compiler">JSDoc</a> is used on all classes, fields, and methods.</p>
   1913 
   1914 <h3 id="jsdoc-general-form">7.1 General form</h3>
   1915 
   1916 <p>The basic formatting of JSDoc blocks is as seen in this example:</p>
   1917 
   1918 <pre><code class="language-js prettyprint">/**
   1919  * Multiple lines of JSDoc text are written here,
   1920  * wrapped normally.
   1921  * @param {number} arg A number to do something to.
   1922  */
   1923 function doSomething(arg) { &#8230; }
   1924 </code></pre>
   1925 
   1926 <p>or in this single-line example:</p>
   1927 
   1928 <pre><code class="language-js prettyprint">/** @const @private {!Foo} A short bit of JSDoc. */
   1929 this.foo_ = foo;
   1930 </code></pre>
   1931 
   1932 <p>If a single-line comment overflows into multiple lines, it must use the
   1933 multi-line style with <code>/**</code> and <code>*/</code> on their own lines.</p>
   1934 
   1935 <p>Many tools extract metadata from JSDoc comments to perform code validation and
   1936 optimization.  As such, these comments <strong>must</strong> be well-formed.</p>
   1937 
   1938 <h3 id="jsdoc-markdown">7.2 Markdown</h3>
   1939 
   1940 <p>JSDoc is written in Markdown, though it may include HTML when necessary.</p>
   1941 
   1942 <p>Note that tools that automatically extract JSDoc (e.g. <a href="https://github.com/jleyba/js-dossier">JsDossier</a>) will often
   1943 ignore plain text formatting, so if you did this:</p>
   1944 
   1945 <pre><code class="language-js prettyprint badcode">/**
   1946  * Computes weight based on three factors:
   1947  *   items sent
   1948  *   items received
   1949  *   last timestamp
   1950  */
   1951 </code></pre>
   1952 
   1953 <p>it would come out like this:</p>
   1954 
   1955 <pre><code>Computes weight based on three factors: items sent items received last timestamp
   1956 </code></pre>
   1957 
   1958 <p>Instead, write a Markdown list:</p>
   1959 
   1960 <pre><code class="language-js prettyprint">/**
   1961  * Computes weight based on three factors:
   1962  *  - items sent
   1963  *  - items received
   1964  *  - last timestamp
   1965  */
   1966 </code></pre>
   1967 
   1968 <h3 id="jsdoc-tags">7.3 JSDoc tags</h3>
   1969 
   1970 <p>Google style allows a subset of JSDoc tags.  See
   1971 <a href="#appendices-jsdoc-tag-reference">??</a> for the complete list.  Most tags must
   1972 occupy their own line, with the tag at the beginning of the line.</p>
   1973 
   1974 <p>Illegal:</p>
   1975 
   1976 <pre><code class="language-js prettyprint badcode">/**
   1977  * The "param" tag must occupy its own line and may not be combined.
   1978  * @param {number} left @param {number} right
   1979  */
   1980 function add(left, right) { ... }
   1981 </code></pre>
   1982 
   1983 <p>Simple tags that do not require any additional data (such as <code>@private</code>,
   1984 <code>@const</code>, <code>@final</code>, <code>@export</code>) may be combined onto the same line, along with an
   1985 optional type when appropriate.</p>
   1986 
   1987 <pre><code class="language-js prettyprint">/**
   1988  * Place more complex annotations (like "implements" and "template")
   1989  * on their own lines.  Multiple simple tags (like "export" and "final")
   1990  * may be combined in one line.
   1991  * @export @final
   1992  * @implements {Iterable&lt;TYPE&gt;}
   1993  * @template TYPE
   1994  */
   1995 class MyClass {
   1996   /**
   1997    * @param {!ObjType} obj Some object.
   1998    * @param {number=} num An optional number.
   1999    */
   2000   constructor(obj, num = 42) {
   2001     /** @private @const {!Array&lt;!ObjType|number&gt;} */
   2002     this.data_ = [obj, num];
   2003   }
   2004 }
   2005 </code></pre>
   2006 
   2007 <p>There is no hard rule for when to combine tags, or in which order, but be
   2008 consistent.</p>
   2009 
   2010 <p>For general information about annotating types in JavaScript see
   2011 <a href="https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler">Annotating JavaScript for the Closure Compiler</a> and <a href="https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System">Types in the Closure Type
   2012 System</a>.</p>
   2013 
   2014 <h3 id="jsdoc-line-wrapping">7.4 Line wrapping</h3>
   2015 
   2016 <p>Line-wrapped block tags are indented four spaces.  Wrapped description text may
   2017 be lined up with the description on previous lines, but this horizontal
   2018 alignment is discouraged.</p>
   2019 
   2020 <pre><code class="language-js prettyprint">/**
   2021  * Illustrates line wrapping for long param/return descriptions.
   2022  * @param {string} foo This is a param with a description too long to fit in
   2023  *     one line.
   2024  * @return {number} This returns something that has a description too long to
   2025  *     fit in one line.
   2026  */
   2027 exports.method = function(foo) {
   2028   return 5;
   2029 };
   2030 </code></pre>
   2031 
   2032 <p>Do not indent when wrapping a <code>@fileoverview</code> description.</p>
   2033 
   2034 <h3 id="jsdoc-top-file-level-comments">7.5 Top/file-level comments</h3>
   2035 
   2036 <p>A file may have a top-level file overview. A copyright notice , author information, and
   2037 default <a href="#jsdoc-visibility-annotations">visibility level</a> are optional.  File overviews are generally recommended whenever a
   2038 file consists of more than a single class definition. The top level comment is
   2039 designed to orient readers unfamiliar with the code to what is in this file. If
   2040 present, it may provide a description of the file's contents and any
   2041 dependencies or compatibility information. Wrapped lines are not indented.</p>
   2042 
   2043 <p>Example:</p>
   2044 
   2045 <pre><code class="language-js prettyprint">/**
   2046  * @fileoverview Description of file, its uses and information
   2047  * about its dependencies.
   2048  * @package
   2049  */
   2050 </code></pre>
   2051 
   2052 <h3 id="jsdoc-class-comments">7.6 Class comments</h3>
   2053 
   2054 <p>Classes, interfaces and records must be documented with a description and any
   2055 template parameters, implemented interfaces, visibility, or other appropriate
   2056 tags. The class description should provide the reader with enough information to
   2057 know how and when to use the class, as well as any additional considerations
   2058 necessary to correctly use the class. Textual descriptions may be omitted on the
   2059 constructor. <code>@constructor</code> and <code>@extends</code> annotations are not used with the
   2060 <code>class</code> keyword unless the class is being used to declare an <code>@interface</code> or
   2061 it extends a generic class.</p>
   2062 
   2063 <pre><code class="language-js prettyprint">/**
   2064  * A fancier event target that does cool things.
   2065  * @implements {Iterable&lt;string&gt;}
   2066  */
   2067 class MyFancyTarget extends EventTarget {
   2068   /**
   2069    * @param {string} arg1 An argument that makes this more interesting.
   2070    * @param {!Array&lt;number&gt;} arg2 List of numbers to be processed.
   2071    */
   2072   constructor(arg1, arg2) {
   2073     // ...
   2074   }
   2075 };
   2076 
   2077 /**
   2078  * Records are also helpful.
   2079  * @extends {Iterator&lt;TYPE&gt;}
   2080  * @record
   2081  * @template TYPE
   2082  */
   2083 class Listable {
   2084   /** @return {TYPE} The next item in line to be returned. */
   2085   next() {}
   2086 }
   2087 </code></pre>
   2088 
   2089 <h3 id="jsdoc-enum-and-typedef-comments">7.7 Enum and typedef comments</h3>
   2090 
   2091 <p>Enums and typedefs must be documented.  Public enums and typedefs must have a
   2092 non-empty description.  Individual enum items may be documented with a JSDoc
   2093 comment on the preceding line.</p>
   2094 
   2095 <pre><code class="language-js prettyprint">/**
   2096  * A useful type union, which is reused often.
   2097  * @typedef {!Bandersnatch|!BandersnatchType}
   2098  */
   2099 let CoolUnionType;
   2100 
   2101 
   2102 /**
   2103  * Types of bandersnatches.
   2104  * @enum {string}
   2105  */
   2106 const BandersnatchType = {
   2107   /** This kind is really frumious. */
   2108   FRUMIOUS: 'frumious',
   2109   /** The less-frumious kind. */
   2110   MANXOME: 'manxome',
   2111 };
   2112 </code></pre>
   2113 
   2114 <p>Typedefs are useful for defining short record types, or aliases for unions,
   2115 complex functions, or generic types.
   2116 Typedefs should be avoided for record types with many fields, since they do not
   2117 allow documenting individual fields, nor using templates or recursive
   2118 references.
   2119 For large record types, prefer <code>@record</code>.</p>
   2120 
   2121 <h3 id="jsdoc-method-and-function-comments">7.8 Method and function comments</h3>
   2122 
   2123 <p>Parameter and return types must be documented. The <code>this</code> type should be
   2124 documented when necessary. Method, parameter, and return descriptions (but not
   2125 types) may be omitted if they are obvious from the rest of the method&#8217;s JSDoc or
   2126 from its signature. Method descriptions should start with a sentence written in
   2127 the third person declarative voice.  If a method overrides a superclass method,
   2128 it must include an <code>@override</code> annotation.  Overridden methods must include all
   2129 <code>@param</code> and <code>@return</code> annotations if any types are refined, but should omit
   2130 them if the types are all the same.</p>
   2131 
   2132 <pre><code class="language-js prettyprint">/** This is a class. */
   2133 class SomeClass extends SomeBaseClass {
   2134   /**
   2135    * Operates on an instance of MyClass and returns something.
   2136    * @param {!MyClass} obj An object that for some reason needs detailed
   2137    *     explanation that spans multiple lines.
   2138    * @param {!OtherClass} obviousOtherClass
   2139    * @return {boolean} Whether something occurred.
   2140    */
   2141   someMethod(obj, obviousOtherClass) { ... }
   2142 
   2143   /** @override */
   2144   overriddenMethod(param) { ... }
   2145 }
   2146 
   2147 /**
   2148  * Demonstrates how top-level functions follow the same rules.  This one
   2149  * makes an array.
   2150  * @param {TYPE} arg
   2151  * @return {!Array&lt;TYPE&gt;}
   2152  * @template TYPE
   2153  */
   2154 function makeArray(arg) { ... }
   2155 </code></pre>
   2156 
   2157 
   2158 
   2159 <p>Anonymous functions do not require JSDoc, though parameter types may be specified inline if the automatic type inference is insufficient.</p>
   2160 
   2161 <pre><code class="language-js prettyprint">promise.then(
   2162     (/** !Array&lt;number|string&gt; */ items) =&gt; {
   2163       doSomethingWith(items);
   2164       return /** @type {string} */ (items[0]);
   2165     });
   2166 </code></pre>
   2167 
   2168 <h3 id="jsdoc-property-comments">7.9 Property comments</h3>
   2169 
   2170 <p>Property types must be documented. The description may be omitted for private
   2171 properties, if name and type provide enough documentation for understanding the
   2172 code.</p>
   2173 
   2174 <p>Publicly exported constants are commented the same way as properties.  Explicit
   2175 types may be omitted for <code>@const</code> properties initialized from an expression with
   2176 an obviously known type.</p>
   2177 
   2178 <p>Tip: A <code>@const</code> property&#8217;s type can be considered &#8220;obviously known&#8221; if it is
   2179 assigned directly from a constructor parameter with a declared type, or directly
   2180 from a function call with a declared return type.  Non-const properties and
   2181 properties assigned from more complex expressions should have their types
   2182 declared explicitly.</p>
   2183 
   2184 <pre><code class="language-js prettyprint">/** My class. */
   2185 class MyClass {
   2186   /** @param {string=} someString */
   2187   constructor(someString = 'default string') {
   2188     /** @private @const */
   2189     this.someString_ = someString;
   2190 
   2191     /** @private @const {!OtherType} */
   2192     this.someOtherThing_ = functionThatReturnsAThing();
   2193 
   2194     /**
   2195      * Maximum number of things per pane.
   2196      * @type {number}
   2197      */
   2198     this.someProperty = 4;
   2199   }
   2200 }
   2201 
   2202 /**
   2203  * The number of times we'll try before giving up.
   2204  * @const
   2205  */
   2206 MyClass.RETRY_COUNT = 33;
   2207 </code></pre>
   2208 
   2209 <h3 id="jsdoc-type-annotations">7.10 Type annotations</h3>
   2210 
   2211 <p>Type annotations are found on <code>@param</code>, <code>@return</code>, <code>@this</code>, and <code>@type</code> tags,
   2212 and optionally on <code>@const</code>, <code>@export</code>, and any visibility tags.  Type
   2213 annotations attached to JSDoc tags must always be enclosed in braces.</p>
   2214 
   2215 <h4 id="jsdoc-nullability">7.10.1 Nullability</h4>
   2216 
   2217 <p>The type system defines modifiers <code>!</code> and <code>?</code> for non-null and nullable,
   2218 respectively.  Primitive types (<code>undefined</code>, <code>string</code>, <code>number</code>, <code>boolean</code>,
   2219 <code>symbol</code>, and <code>function(...): ...</code>) and record literals (<code>{foo: string, bar:
   2220 number}</code>) are non-null by default.  Do not add an explicit <code>!</code> to these types.
   2221 Object types (<code>Array</code>, <code>Element</code>, <code>MyClass</code>, etc) are nullable by default, but
   2222 cannot be immediately distinguished from a name that is <code>@typedef</code>&#8217;d to a
   2223 non-null-by-default type.  As such, all types except primitives and record
   2224 literals must be annotated explicitly with either <code>?</code> or <code>!</code> to indicate whether
   2225 they are nullable or not.</p>
   2226 
   2227 <h4 id="jsdoc-type-casts">7.10.2 Type Casts</h4>
   2228 
   2229 <p>In cases where type checking doesn't accurately infer the type of an expression,
   2230 it is possible to tighten the type by adding a type annotation comment and
   2231 enclosing the expression in parentheses. Note that the parentheses are required.</p>
   2232 
   2233 <pre><code class="language-js prettyprint">/** @type {number} */ (x)
   2234 </code></pre>
   2235 
   2236 <h4 id="jsdoc-template-parameter-types">7.10.3 Template Parameter Types</h4>
   2237 
   2238 <p>Always specify template parameters. This way compiler can do a better job and it
   2239 makes it easier for readers to understand what code does.</p>
   2240 
   2241 <p>Bad:</p>
   2242 
   2243 <pre><code class="language-js prettyprint badcode">const /** !Object */ users = {};
   2244 const /** !Array */ books = [];
   2245 const /** !Promise */ response = ...;
   2246 </code></pre>
   2247 
   2248 <p>Good:</p>
   2249 
   2250 <pre><code class="language-js prettyprint">const /** !Object&lt;string, !User&gt; */ users = {};
   2251 const /** !Array&lt;string&gt; */ books = [];
   2252 const /** !Promise&lt;!Response&gt; */ response = ...;
   2253 
   2254 const /** !Promise&lt;undefined&gt; */ thisPromiseReturnsNothingButParameterIsStillUseful = ...;
   2255 const /** !Object&lt;string, *&gt; */ mapOfEverything = {};
   2256 </code></pre>
   2257 
   2258 <p>Cases when template parameters should not be used:</p>
   2259 
   2260 <ul>
   2261 <li><code>Object</code> is used for type hierarchy and not as map-like structure.</li>
   2262 </ul>
   2263 
   2264 <h3 id="jsdoc-visibility-annotations">7.11 Visibility annotations</h3>
   2265 
   2266 <p>Visibility annotations (<code>@private</code>, <code>@package</code>, <code>@protected</code>) may be specified
   2267 in a <code>@fileoverview</code> block, or on any exported symbol or property.  Do not
   2268 specify visibility for local variables, whether within a function or at the top
   2269 level of a module.  All <code>@private</code> names must end with an underscore.</p>
   2270 
   2271 <h2 id="policies">8 Policies</h2>
   2272 
   2273 <h3 id="policies-be-consistent">8.1 Issues unspecified by Google Style: Be Consistent!</h3>
   2274 
   2275 <p>For any style question that isn't settled definitively by this specification,
   2276 prefer to do what the other code in the same file is already doing. If that
   2277 doesn't resolve the question, consider emulating the other files in the same
   2278 package.</p>
   2279 
   2280 <h3 id="policies-compiler-warnings">8.2 Compiler warnings</h3>
   2281 
   2282 <h4 id="policies-use-a-standard-warning-set">8.2.1 Use a standard warning set</h4>
   2283 
   2284 <p>
   2285 As far as possible projects should use <code>--warning_level=VERBOSE</code>.
   2286 </p>
   2287 
   2288 <h4 id="policies-how-to-handle-a-warning">8.2.2 How to handle a warning</h4>
   2289 
   2290 <p>Before doing anything, make sure you understand exactly what the warning is
   2291 telling you. If you're not positive why a warning is appearing, ask for help
   2292 .</p>
   2293 
   2294 <p>Once you understand the warning, attempt the following solutions in order:</p>
   2295 
   2296 <ol>
   2297 <li><strong>First, fix it or work around it.</strong> Make a strong attempt to actually
   2298 address the warning, or find another way to accomplish the task that avoids
   2299 the situation entirely.</li>
   2300 <li><strong>Otherwise, determine if it's a false alarm.</strong> If you are convinced that
   2301 the warning is invalid and that the code is actually safe and correct, add a
   2302 comment to convince the reader of this fact and apply the <code>@suppress</code>
   2303 annotation.</li>
   2304 <li><strong>Otherwise, leave a TODO comment.</strong> This is a <strong>last resort</strong>.  If you do
   2305 this, <strong>do not suppress the warning.</strong> The warning should be visible until
   2306 it can be taken care of properly.</li>
   2307 </ol>
   2308 
   2309 <h4 id="policies-suppress-a-warning-at-the-narrowest-reasonable-scope">8.2.3 Suppress a warning at the narrowest reasonable scope</h4>
   2310 
   2311 <p>Warnings are suppressed at the narrowest reasonable scope, usually that of a single local variable or very small method. Often a variable or method is extracted for that reason alone.</p>
   2312 
   2313 <p>Example</p>
   2314 
   2315 <pre><code class="language-js prettyprint">/** @suppress {uselessCode} Unrecognized 'use asm' declaration */
   2316 function fn() {
   2317   'use asm';
   2318   return 0;
   2319 }
   2320 </code></pre>
   2321 
   2322 <p>Even a large number of suppressions in a class is still better than blinding the
   2323 entire class to this type of warning.</p>
   2324 
   2325 <h3 id="policies-deprecation">8.3 Deprecation</h3>
   2326 
   2327 <p>Mark deprecated methods, classes or interfaces with <code>@deprecated</code> annotations. A
   2328 deprecation comment must include simple, clear directions for people to fix
   2329 their call sites.</p>
   2330 
   2331 <h3 id="policies-code-not-in-google-style">8.4 Code not in Google Style</h3>
   2332 
   2333 <p>You will occasionally encounter files in your codebase that are not in proper
   2334 Google Style. These may have come from an acquisition, or may have been written
   2335 before Google Style took a position on some issue, or may be in non-Google Style
   2336 for any other reason.</p>
   2337 
   2338 <h4 id="policies-reformatting-existing-code">8.4.1 Reformatting existing code</h4>
   2339 
   2340 <p>When updating the style of existing code, follow these guidelines.</p>
   2341 
   2342 <ol>
   2343 <li>It is not required to change all existing code to meet current style
   2344 guidelines.  Reformatting existing code is a trade-off between code churn
   2345 and consistency. Style rules evolve over time and these kinds of tweaks to
   2346 maintain compliance would create unnecessary churn.  However, if significant
   2347 changes are being made to a file it is expected that the file will be in
   2348 Google Style.</li>
   2349 <li>Be careful not to allow opportunistic style fixes to muddle the focus of a
   2350 CL. If you find yourself making a lot of style changes that aren&#8217;t critical
   2351 to the central focus of a CL, promote those changes to a separate CL.</li>
   2352 </ol>
   2353 
   2354 <h4 id="policies-newly-added-code-use-google-style">8.4.2 Newly added code: use Google Style</h4>
   2355 
   2356 <p>Brand new files use Google Style, regardless of the style choices of other files
   2357 in the same package.</p>
   2358 
   2359 <p>When adding new code to a file that is not in Google Style, reformatting the
   2360 existing code first is recommended, subject to the advice in
   2361 <a href="#policies-reformatting-existing-code">??</a>.</p>
   2362 
   2363 <p>If this reformatting is not done, then new code should be as consistent as
   2364 possible with existing code in the same file, but must not violate the style
   2365 guide.</p>
   2366 
   2367 <h3 id="policies-local-style-rules">8.5 Local style rules</h3>
   2368 
   2369 <p>Teams and projects may adopt additional style rules beyond those in this
   2370 document, but must accept that cleanup changes may not abide by these additional
   2371 rules, and must not block such cleanup changes due to violating any additional
   2372 rules. Beware of excessive rules which serve no purpose. The style guide does
   2373 not seek to define style in every possible scenario and neither should you.</p>
   2374 
   2375 <h3 id="policies-generated-code-mostly-exempt">8.6 Generated code: mostly exempt</h3>
   2376 
   2377 <p>Source code generated by the build process is not required to be in Google
   2378 Style. However, any generated identifiers that will be referenced from
   2379 hand-written source code must follow the naming requirements. As a special
   2380 exception, such identifiers are allowed to contain underscores, which may help
   2381 to avoid conflicts with hand-written identifiers.</p>
   2382 
   2383 <h2 id="appendices">9 Appendices</h2>
   2384 
   2385 <h3 id="appendices-jsdoc-tag-reference">9.1 JSDoc tag reference</h3>
   2386 
   2387 <p>JSDoc serves multiple purposes in JavaScript.  In addition to being used to
   2388 generate documentation it is also used to control tooling.  The best known are
   2389 the Closure Compiler type annotations.</p>
   2390 
   2391 <h4 id="appendices-type-annotations">9.1.1 Type annotations and other Closure Compiler annotations</h4>
   2392 
   2393 <p>Documentation for JSDoc used by the Closure Compiler is described in
   2394 <a href="https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler">Annotating JavaScript for the Closure Compiler</a> and <a href="https://github.com/google/closure-compiler/wiki/Types-in-the-Closure-Type-System">Types in the Closure Type
   2395 System</a>.</p>
   2396 
   2397 <h4 id="appendices-documentation-annotations">9.1.2 Documentation annotations</h4>
   2398 
   2399 <p>In addition to the JSDoc described in <a href="https://github.com/google/closure-compiler/wiki/Annotating-JavaScript-for-the-Closure-Compiler">Annotating JavaScript for the Closure
   2400 Compiler</a> the following tags are common and well supported by various
   2401 documentation generations tools (such as <a href="https://github.com/jleyba/js-dossier">JsDossier</a>) for purely documentation
   2402 purposes.
   2403 <table>
   2404   <thead>
   2405     <tr>
   2406       <th>Tag
   2407       </th><th>Template &amp; Examples
   2408       </th><th>Description
   2409   </th></tr></thead><tbody>
   2410     <tr>
   2411       <td><code>@author</code> or <code>@owner</code>
   2412       </td><td><code>@author username (a] google.com (First Last)</code>
   2413         <p><em>For example:</em>
   2414         </p><pre class="prettyprint lang-js">
   2415 /**
   2416  * @fileoverview Utilities for handling textareas.
   2417  * @author <a href="mailto:kuth (a] google.com">kuth (a] google.com</a> (Uthur Pendragon)
   2418  */
   2419  </pre>
   2420       </td><td>Document the author of a file or the owner of a test, generally only
   2421         used in the <code>@fileoverview</code> comment. The <code>@owner</code> tag is used by the
   2422         unit test dashboard to determine who owns the test results.
   2423         <p>Not recommended.
   2424     </p></td></tr><tr>
   2425       <td><code>@bug</code>
   2426       </td><td><code>@bug bugnumber</code>
   2427         <p><em>For example:</em>
   2428         </p><pre class="prettyprint lang-js">
   2429 /** @bug 1234567 */
   2430 function testSomething() {
   2431   // &#8230;
   2432 }
   2433 
   2434 <p>/**
   2435  * @bug 1234568
   2436  * @bug 1234569
   2437  */
   2438 function testTwoBugs() {
   2439   // &#8230;
   2440 }
   2441 </p></pre>
   2442       </td><td>Indicates what bugs the given test function regression tests.
   2443         <p>Multiple bugs should each have their own <code>@bug</code> line, to make
   2444         searching for regression tests as easy as possible.
   2445     </p></td></tr><tr>
   2446       <td><code>@code</code>
   2447       </td><td><code>{@code ...}</code>
   2448         <p><em>For example:</em>
   2449         </p><pre class="prettyprint lang-js">
   2450 /**
   2451  * Moves to the next position in the selection.
   2452  * Throws {@code goog.iter.StopIteration} when it
   2453  * passes the end of the range.
   2454  * @return {!Node} The node at the next position.
   2455  */
   2456 goog.dom.RangeIterator.prototype.next = function() {
   2457   // &#8230;
   2458 };
   2459 </pre>
   2460       </td><td>Indicates that a term in a JSDoc description is code so it may be
   2461         correctly formatted in generated documentation.
   2462     </td></tr><tr>
   2463       <td><code>@see</code>
   2464       </td><td><code>@see Link</code>
   2465         <p><em>For example:</em>
   2466         </p><pre class="prettyprint lang-js">
   2467 /**
   2468  * Adds a single item, recklessly.
   2469  * @see #addSafely
   2470  * @see goog.Collect
   2471  * @see goog.RecklessAdder#add
   2472  */
   2473  </pre>
   2474        </td><td>Reference a lookup to another class function or method.
   2475     </td></tr><tr>
   2476       <td><code>@supported</code>
   2477       </td><td><code>@supported Description</code>
   2478         <p><em>For example:</em>
   2479         </p><pre class="prettyprint lang-js">
   2480 /**
   2481  * @fileoverview Event Manager
   2482  * Provides an abstracted interface to the
   2483  * browsers' event systems.
   2484  * @supported IE10+, Chrome, Safari
   2485  */
   2486 </pre>
   2487       </td><td>Used in a fileoverview to indicate what browsers are supported by
   2488         the file.
   2489     </td></tr><tr>
   2490       <td><code>@desc</code>
   2491       </td><td><code>@desc Message description</code>
   2492         <p><em>For example:</em>
   2493         </p><pre class="prettyprint lang-js">
   2494 /** @desc Notifying a user that their account has been created. */
   2495 exports.MSG_ACCOUNT_CREATED = goog.getMsg(
   2496     'Your account has been successfully created.');
   2497  </pre>
   2498       </td></tr></tbody></table></p>
   2499 
   2500 <p>You may also see other types of JSDoc annotations in third-party code. These
   2501 annotations appear in the <a href="http://code.google.com/p/jsdoc-toolkit/wiki/TagReference">JSDoc Toolkit Tag Reference</a> but are not considered
   2502 part of valid Google style.</p>
   2503 
   2504 <h4 id="appendices-framework-specific-annotations">9.1.3 Framework specific annotations</h4>
   2505 
   2506 <p>The following annotations are specific to a particular framework.
   2507 <table>
   2508   <thead>
   2509     <tr>
   2510       <th>Framework
   2511       </th><th>Tag
   2512       </th><th>Documentation
   2513   </th></tr></thead><tbody>
   2514     <tr>
   2515       <td>Angular 1
   2516       </td><td><code>@ngInject</code>
   2517       </td></tr><tr>
   2518       <td>Polymer
   2519       </td><td><code>@polymerBehavior</code>
   2520       </td><td>
   2521           
   2522             <a href="https://github.com/google/closure-compiler/wiki/Polymer-Pass">https://github.com/google/closure-compiler/wiki/Polymer-Pass</a>
   2523           
   2524     </td></tr></tbody></table></p>
   2525 
   2526 <h4 id="appendices-notes-about-standard-closure-compiler-annotations">9.1.4 Notes about standard Closure Compiler annotations</h4>
   2527 
   2528 <p>The following tags used to be standard but are now deprecated.
   2529 <table>
   2530   <thead>
   2531     <tr>
   2532       <th>Tag
   2533       </th><th>Template &amp; Examples
   2534       </th><th>Description
   2535   </th></tr></thead><tbody>
   2536     <tr>
   2537       <td><code>@expose</code>
   2538       </td><td><code>@expose</code>
   2539       </td><td><strong>Deprecated. Do not use. Use <code>@export</code> and/or <code>@nocollapse</code>
   2540         instead.</strong>
   2541     </td></tr><tr>
   2542       <td><code>@inheritDoc</code>
   2543       </td><td><code>@inheritDoc</code>
   2544       </td><td><strong>Deprecated. Do not use. Use <code>@override</code> instead.</strong>
   2545 </td></tr></tbody></table></p>
   2546 
   2547 <h3 id="appendices-commonly-misunderstood-style-rules">9.2 Commonly misunderstood style rules</h3>
   2548 
   2549 <p>Here is a collection of lesser-known or commonly misunderstood facts about
   2550 Google Style for JavaScript. (The following are true statements; this is not a
   2551 list of <q>myths.</q>)</p>
   2552 
   2553 <ul>
   2554 <li>Neither a copyright statement nor <code>@author</code> credit is required in a source
   2555 file. (Neither is explicitly recommended, either.)</li>
   2556 <li>Aside from the constructor coming first
   2557 (<a href="#features-classes-constructors">??</a>), there is no <q>hard and fast</q> rule
   2558 governing how to order the members of a class (<a href="#features-classes">??</a>).</li>
   2559 <li>Empty blocks can usually be represented concisely as <code>{}</code>, as detailed in
   2560 (<a href="#formatting-empty-blocks">??</a>).</li>
   2561 <li>The prime directive of line-wrapping is: prefer to break at a higher
   2562 syntactic level (<a href="#formatting-where-to-break">??</a>).</li>
   2563 <li>Non-ASCII characters are allowed in string literals, comments and Javadoc,
   2564 and in fact are recommended when they make the code easier to read than the
   2565 equivalent Unicode escape would (<a href="#non-ascii-characters">??</a>).</li>
   2566 </ul>
   2567 
   2568 <h3 id="appendices-style-related-tools">9.3 Style-related tools</h3>
   2569 
   2570 <p>The following tools exist to support various aspects of Google Style.</p>
   2571 
   2572 <h4 id="appendices-tools-closure-compiler">9.3.1 Closure Compiler</h4>
   2573 
   2574 <p>This program performs type checking and other checks,
   2575 optimizations and other transformations (such as ECMAScript 6 to ECMAScript 5
   2576 code lowering).</p>
   2577 
   2578 <h4 id="appendices-clang-format">9.3.2 <code>clang-format</code></h4>
   2579 
   2580 <p>This program  reformats
   2581 JavaScript source code into Google Style, and also follows a number of
   2582 non-required but frequently readability-enhancing formatting practices.</p>
   2583 
   2584 <p><code>clang-format</code> is not required. Authors are allowed to change its output, and
   2585 reviewers are allowed to ask for such changes; disputes are worked out in the
   2586 usual way. However, subtrees may choose to opt in to such enforcement locally.</p>
   2587 
   2588 <h4 id="appendices-closure-compiler-linter">9.3.3 Closure compiler linter</h4>
   2589 
   2590 <p>This program  checks for a
   2591 variety of missteps and anti-patterns.
   2592 </p>
   2593 
   2594 <h4 id="appendices-conformance-framework">9.3.4 Conformance framework</h4>
   2595 
   2596 <p>The JS Conformance Framework is a tool that is part of the Closure Compiler that
   2597 provides developers a simple means to specify a set of additional checks to be
   2598 run against their code base above the standard checks.  Conformance checks can,
   2599 for example, forbid access to a certain property, or calls to a certain
   2600 function, or missing type information (unknowns).</p>
   2601 
   2602 <p>These rules are commonly used to enforce critical restrictions (such as defining
   2603 globals, which could break the codebase) and security patterns (such as using
   2604 <code>eval</code> or assigning to <code>innerHTML</code>), or more loosely to improve code quality.</p>
   2605 
   2606 <p>For additional information see the official documentation for the
   2607 <a href="https://github.com/google/closure-compiler/wiki/JS-Conformance-Framework">JS Conformance Framework</a>.</p>
   2608 
   2609 <h3 id="appendices-legacy-exceptions">9.4 Exceptions for legacy platforms</h3>
   2610 
   2611 <h4 id="appendices-legacy-exceptions-overview">9.4.1 Overview</h4>
   2612 
   2613 <p>This section describes exceptions and additional rules to be followed when
   2614 modern ECMAScript 6 syntax is not available to the code authors. Exceptions to
   2615 the recommended style are required when ECMAScript 6 syntax is not possible and
   2616 are outlined here:</p>
   2617 
   2618 <ul>
   2619 <li>Use of <code>var</code> declarations is allowed</li>
   2620 <li>Use of <code>arguments</code> is allowed</li>
   2621 <li>Optional parameters without default values are allowed</li>
   2622 </ul>
   2623 
   2624 <h4 id="appendices-legacy-exceptions-var">9.4.2 Use <code>var</code></h4>
   2625 
   2626 <h5 id="appendices-legacy-exceptions-var-scope">9.4.2.1 <code>var</code> declarations are NOT block-scoped</h5>
   2627 
   2628 <p><code>var</code> declarations are scoped to the beginning of the nearest enclosing
   2629 function, script or module, which can cause unexpected behavior, especially with
   2630 function closures that reference <code>var</code> declarations inside of loops. The
   2631 following code gives an example:</p>
   2632 
   2633 <pre><code class="language-js prettyprint badcode">for (var i = 0; i &lt; 3; ++i) {
   2634   var iteration = i;
   2635   setTimeout(function() { console.log(iteration); }, i*1000);
   2636 }
   2637 
   2638 // logs 2, 2, 2 -- NOT 0, 1, 2
   2639 // because `iteration` is function-scoped, not local to the loop.
   2640 
   2641 </code></pre>
   2642 
   2643 <h5 id="appendices-legacy-exceptions-var-declare">9.4.2.2 Declare variables as close as possible to first use</h5>
   2644 
   2645 <p>Even though <code>var</code> declarations are scoped to the beginning of the enclosing
   2646 function, <code>var</code> declarations should be as close as possible to their first use,
   2647 for readability purposes. However, do not put a <code>var</code> declaration inside a block
   2648 if that variable is referenced outside the block. For example:</p>
   2649 
   2650 <pre><code class="language-js prettyprint">function sillyFunction() {
   2651   var count = 0;
   2652   for (var x in y) {
   2653     // "count" could be declared here, but don't do that.
   2654     count++;
   2655   }
   2656   console.log(count + ' items in y');
   2657 }
   2658 </code></pre>
   2659 
   2660 <h5 id="appendices-legacy-exceptions-var-const">9.4.2.3 Use @const for constants variables</h5>
   2661 
   2662 <p>For global declarations where the <code>const</code> keyword would be used, if it were
   2663 available, annotate the <code>var</code> declaration with @const instead (this is optional
   2664 for local variables).</p>
   2665 
   2666 <h4 id="appendices-legacy-exceptions-function">9.4.3 Do not use block scoped functions declarations</h4>
   2667 
   2668 <p>Do <strong>not</strong> do this:</p>
   2669 
   2670 <pre><code class="language-js prettyprint badcode">if (x) {
   2671   function foo() {}
   2672 }
   2673 </code></pre>
   2674 
   2675 <p>While most JavaScript VMs implemented before ECMAScript 6 support function
   2676 declarations within blocks it was not standardized. Implementations were
   2677 inconsistent with each other and with the now-standard ECMAScript 6 behavior for
   2678 block scoped function declaration. ECMAScript 5 and prior only allow for
   2679 function declarations in the root statement list of a script or function and
   2680 explicitly ban them in block scopes in strict mode.</p>
   2681 
   2682 <p>To get consistent behavior, instead use a <code>var</code> initialized with a function
   2683 expression to define a function within a block:</p>
   2684 
   2685 <pre><code class="language-js prettyprint">if (x) {
   2686   var foo = function() {};
   2687 }
   2688 </code></pre>
   2689 
   2690 <h4 id="appendices-legacy-exceptions-goog-provide">9.4.4 Dependency management with <code>goog.provide</code>/<code>goog.require</code></h4>
   2691 
   2692 <p><strong><code>goog.provide</code> is deprecated. All new files should use <code>goog.module</code>, even in
   2693 projects with existing <code>goog.provide</code> usage. The following rules are for
   2694 pre-existing goog.provide files, only.</strong></p>
   2695 
   2696 <h5 id="appendices-legacy-exceptions-goog-provide-summary">9.4.4.1 Summary</h5>
   2697 
   2698 <ul>
   2699 <li>Place all <code>goog.provide</code>s first, <code>goog.require</code>s second. Separate provides
   2700 from requires with an empty line.</li>
   2701 <li>Sort the entries alphabetically (uppercase first).</li>
   2702 <li>Don't wrap <code>goog.provide</code> and <code>goog.require</code> statements. Exceed 80 columns
   2703 if necessary.</li>
   2704 <li>Only provide top-level symbols.</li>
   2705 </ul>
   2706 
   2707 <p>As of Oct 2016, <strong><code>goog.provide</code>/<code>goog.require</code> dependency management is
   2708 deprecated</strong>. All new files, even in projects using <code>goog.provide</code> for older
   2709 files, should use
   2710 <a href="#source-file-structure"><code>goog.module</code></a>.</p>
   2711 
   2712 <p><code>goog.provide</code> statements should be grouped together and placed first. All
   2713 <code>goog.require</code> statements should follow. The two lists should be separated with
   2714 an empty line.</p>
   2715 
   2716 <p>Similar to import statements in other languages, <code>goog.provide</code> and
   2717 <code>goog.require</code> statements should be written in a single line, even if they
   2718 exceed the 80 column line length limit.</p>
   2719 
   2720 <p>The lines should be sorted alphabetically, with uppercase letters coming first:</p>
   2721 
   2722 <pre><code class="language-js prettyprint">goog.provide('namespace.MyClass');
   2723 goog.provide('namespace.helperFoo');
   2724 
   2725 goog.require('an.extremelyLongNamespace.thatSomeoneThought.wouldBeNice.andNowItIsLonger.Than80Columns');
   2726 goog.require('goog.dom');
   2727 goog.require('goog.dom.TagName');
   2728 goog.require('goog.dom.classes');
   2729 goog.require('goog.dominoes');
   2730 
   2731 </code></pre>
   2732 
   2733 <p>All members defined on a class should be in the same file. Only top-level
   2734 classes should be provided in a file that contains multiple members defined on
   2735 the same class (e.g. enums, inner classes, etc).</p>
   2736 
   2737 <p>Do this:</p>
   2738 
   2739 <pre><code class="language-js prettyprint">goog.provide('namespace.MyClass');
   2740 </code></pre>
   2741 
   2742 <p>Not this:</p>
   2743 
   2744 <pre><code class="language-js prettyprint badcode">goog.provide('namespace.MyClass');
   2745 goog.provide('namespace.MyClass.CONSTANT');
   2746 goog.provide('namespace.MyClass.Enum');
   2747 goog.provide('namespace.MyClass.InnerClass');
   2748 goog.provide('namespace.MyClass.TypeDef');
   2749 goog.provide('namespace.MyClass.staticMethod');
   2750 </code></pre>
   2751 
   2752 <p>Members on namespaces may also be provided:</p>
   2753 
   2754 <pre><code class="language-js prettyprint">goog.provide('foo.bar');
   2755 goog.provide('foo.bar.CONSTANT');
   2756 goog.provide('foo.bar.method');
   2757 </code></pre>
   2758 
   2759 <h5 id="appendices-legacy-exceptions-goog-scope">9.4.4.2 Aliasing with <code>goog.scope</code></h5>
   2760 
   2761 <p><strong><code>goog.scope</code> is deprecated. New files should not use <code>goog.scope</code> even in
   2762 projects with existing goog.scope usage.</strong></p>
   2763 
   2764 <p><code>goog.scope</code> may be used to shorten references to namespaced symbols in
   2765 code using <code>goog.provide</code>/<code>goog.require</code> dependency management.</p>
   2766 
   2767 <p>Only one <code>goog.scope</code> invocation may be added per file. Always place it in
   2768 the global scope.</p>
   2769 
   2770 <p>The opening <code>goog.scope(function() {</code> invocation must be preceded by exactly one
   2771 blank line and follow any <code>goog.provide</code> statements, <code>goog.require</code> statements,
   2772 or top-level comments. The invocation must be closed on the last line in the
   2773 file. Append <code>// goog.scope</code> to the closing statement of the scope. Separate the
   2774 comment from the semicolon by two spaces.</p>
   2775 
   2776 <p>Similar to C++ namespaces, do not indent under <code>goog.scope</code> declarations.
   2777 Instead, continue from the 0 column.</p>
   2778 
   2779 <p>Only make aliases for names that will not be re-assigned to another object
   2780 (e.g., most constructors, enums, and namespaces). Do not do this (see below for
   2781 how to alias a constructor):</p>
   2782 
   2783 <pre><code class="language-js prettyprint badcode">goog.scope(function() {
   2784 var Button = goog.ui.Button;
   2785 
   2786 Button = function() { ... };
   2787 ...
   2788 </code></pre>
   2789 
   2790 <p>Names must be the same as the last property of the global that they are aliasing.</p>
   2791 
   2792 <pre><code class="language-js prettyprint">goog.provide('my.module.SomeType');
   2793 
   2794 goog.require('goog.dom');
   2795 goog.require('goog.ui.Button');
   2796 
   2797 goog.scope(function() {
   2798 var Button = goog.ui.Button;
   2799 var dom = goog.dom;
   2800 
   2801 // Alias new types after the constructor declaration.
   2802 my.module.SomeType = function() { ... };
   2803 var SomeType = my.module.SomeType;
   2804 
   2805 // Declare methods on the prototype as usual:
   2806 SomeType.prototype.findButton = function() {
   2807   // Button as aliased above.
   2808   this.button = new Button(dom.getElement('my-button'));
   2809 };
   2810 ...
   2811 });  // goog.scope
   2812 </code></pre>
   2813 
   2814 </div>
   2815 </body>
   2816 </html>
   2817