Home | History | Annotate | Download | only in google-styleguide
      1 <?xml version = '1.0'?>
      2 <?xml-stylesheet type="text/xsl" href="styleguide.xsl"?>
      3 <GUIDE title="Google JavaScript Style Guide">
      4   <p class="revision">
      5     Please note: there's a newer version of this guide that includes
      6     ECMAScript 6th Edition features. It lives <a href="jsguide.html">here</a>.
      7     You should probably be using that for new code.
      8 
      9     Revision 2.93
     10   </p>
     11 
     12   <address>
     13     Aaron Whyte<br/>
     14     Bob Jervis<br/>
     15     Dan Pupius<br/>
     16     Erik Arvidsson<br/>
     17     Fritz Schneider<br/>
     18     Robby Walker<br/>
     19   </address>
     20   <OVERVIEW>
     21     <CATEGORY title="Important Note">
     22       <STYLEPOINT title="Displaying Hidden Details in this Guide">
     23         <SUMMARY>
     24           This style guide contains many details that are initially
     25           hidden from view.  They are marked by the triangle icon, which you
     26           see here on your left.  Click it now.
     27           You should see "Hooray" appear below.
     28         </SUMMARY>
     29         <BODY>
     30           <p>
     31             Hooray!  Now you know you can expand points to get more
     32             details.  Alternatively, there's a "toggle all" at the
     33             top of this document.
     34           </p>
     35         </BODY>
     36       </STYLEPOINT>
     37     </CATEGORY>
     38     <CATEGORY title="Background">
     39       <p>
     40         JavaScript is the main client-side scripting language used
     41 
     42         by many of Google's open-source
     43           projects.
     44         This style guide is a list of <em>do</em>s and <em>don't</em>s for
     45         JavaScript programs.
     46       </p>
     47 
     48 
     49 
     50 
     51 
     52     </CATEGORY>
     53   </OVERVIEW>
     54   <CATEGORY title="JavaScript Language Rules">
     55 
     56 
     57 
     58 
     59     <STYLEPOINT title="var">
     60       <SUMMARY>
     61         Declarations with <code>var</code>: Always
     62       </SUMMARY>
     63       <BODY>
     64         <DECISION>
     65           When you fail to specify <code>var</code>,
     66           the variable gets placed in the global context, potentially clobbering
     67           existing values. Also, if there's no declaration, it's hard to tell in
     68           what scope a variable lives (e.g., it could be in the Document or
     69           Window just as easily as in the local scope). So always declare with
     70           <code>var</code>.
     71         </DECISION>
     72       </BODY>
     73     </STYLEPOINT>
     74 
     75     <STYLEPOINT title="Constants">
     76       <SUMMARY>
     77         <ul>
     78           <li>Use <code>NAMES_LIKE_THIS</code> for constant <em>values</em>.</li>
     79           <li>Use <code>@const</code> to indicate a constant (non-overwritable)
     80             <em>pointer</em> (a variable or property).</li>
     81           <li>Never use the
     82             <a href="https://developer.mozilla.org/en/JavaScript/Reference/Statements/const">
     83               <code>const</code> keyword</a>
     84             as it's not supported in Internet Explorer.</li>
     85         </ul>
     86       </SUMMARY>
     87       <BODY>
     88         <DECISION>
     89           <SUBSECTION title="Constant values">
     90 
     91           <p>If a value is intended to be <em>constant</em>
     92              and <em>immutable</em>, it should be given a name
     93              in <code>CONSTANT_VALUE_CASE</code>.
     94              <code>ALL_CAPS</code> additionally implies <code>@const</code>
     95              (that the value is not overwritable).
     96            </p>
     97 
     98            <p>Primitive types (<code>number</code>, <code>string</code>,
     99              <code>boolean</code>) are constant values.</p>
    100 
    101            <p><code>Objects</code>'
    102              immutability is more subjective  objects should be
    103              considered immutable only if they do not demonstrate observable
    104              state change.  This is not enforced by the compiler.</p>
    105 
    106 
    107            </SUBSECTION>
    108 
    109           <SUBSECTION title="Constant pointers (variables and properties)">
    110             <p>The <code>@const</code> annotation on a variable or property
    111               implies that it is not overwritable.  This is enforced by the
    112               compiler at build time.  This behavior is consistent with the
    113               <a href="https://developer.mozilla.org/en/JavaScript/Reference/Statements/const">
    114                 <code>const</code> keyword</a> (which we do not use due to the
    115               lack of support in Internet Explorer).</p>
    116 
    117             <p>A <code>@const</code> annotation on a method additionally
    118               implies that the method cannot not be overridden in subclasses.
    119             </p>
    120 
    121             <p>A <code>@const</code> annotation on a constructor implies the
    122               class cannot be subclassed (akin to <code>final</code> in Java).
    123             </p>
    124 
    125           </SUBSECTION>
    126 
    127           <SUBSECTION title="Examples">
    128 
    129             <p>Note that <code>@const</code> does not necessarily imply
    130               <code>CONSTANT_VALUES_CASE</code>.
    131 
    132               However, <code>CONSTANT_VALUES_CASE</code>
    133               <em>does</em> imply <code>@const</code>.
    134             </p>
    135 
    136             <CODE_SNIPPET>
    137               /**
    138                * Request timeout in milliseconds.
    139                * @type {number}
    140                */
    141               goog.example.TIMEOUT_IN_MILLISECONDS = 60;
    142             </CODE_SNIPPET>
    143 
    144             <p>The number of seconds in a minute never changes.  It is a
    145               constant value.  <code>ALL_CAPS</code>
    146               also implies <code>@const</code>, so the constant cannot be
    147               overwritten.
    148             </p>
    149 
    150             <p>The open source compiler will allow the symbol to be
    151               overwritten because the constant is
    152               <em>not</em> marked as <code>@const</code>.</p>
    153 
    154             <CODE_SNIPPET>
    155               /**
    156                * Map of URL to response string.
    157                * @const
    158                */
    159               MyClass.fetchedUrlCache_ = new goog.structs.Map();
    160             </CODE_SNIPPET>
    161 
    162             <CODE_SNIPPET>
    163               /**
    164                * Class that cannot be subclassed.
    165                * @const
    166                * @constructor
    167                */
    168               sloth.MyFinalClass = function() {};
    169             </CODE_SNIPPET>
    170 
    171             <p>In this case, the pointer can never be overwritten, but
    172               value is highly mutable and <b>not</b> constant (and thus in
    173               <code>camelCase</code>, not <code>ALL_CAPS</code>).</p>
    174         </SUBSECTION>
    175 
    176         </DECISION>
    177       </BODY>
    178     </STYLEPOINT>
    179 
    180     <STYLEPOINT title="Semicolons">
    181       <SUMMARY>
    182         Always use semicolons.
    183       </SUMMARY>
    184       <BODY>
    185         <p>Relying on implicit insertion can cause subtle, hard to debug
    186           problems. Don't do it. You're better than that.</p>
    187         <p>There are a couple places where missing semicolons are particularly
    188           dangerous:</p>
    189         <BAD_CODE_SNIPPET>
    190           // 1.
    191           MyClass.prototype.myMethod = function() {
    192             return 42;
    193           }  // No semicolon here.
    194 
    195           (function() {
    196             // Some initialization code wrapped in a function to create a scope for locals.
    197           })();
    198 
    199 
    200           var x = {
    201             'i': 1,
    202             'j': 2
    203           }  // No semicolon here.
    204 
    205           // 2.  Trying to do one thing on Internet Explorer and another on Firefox.
    206           // I know you'd never write code like this, but throw me a bone.
    207           [ffVersion, ieVersion][isIE]();
    208 
    209 
    210           var THINGS_TO_EAT = [apples, oysters, sprayOnCheese]  // No semicolon here.
    211 
    212           // 3. conditional execution a la bash
    213           -1 == resultOfOperation() || die();
    214         </BAD_CODE_SNIPPET>
    215         <SUBSECTION title="So what happens?">
    216           <ol>
    217             <li>JavaScript error - first the function returning 42 is called
    218               with the second function as a parameter, then the number 42 is
    219               "called" resulting in an error.</li>
    220             <li>You will most likely get a 'no such property in undefined'
    221               error at runtime as it tries to call
    222               <code>x[ffVersion, ieVersion][isIE]()</code>.</li>
    223             <li><code>die</code> is always called since the array minus 1 is
    224               <code>NaN</code> which is never equal to anything (not even if
    225               <code>resultOfOperation()</code> returns <code>NaN</code>) and
    226               <code>THINGS_TO_EAT</code> gets assigned the result of
    227               <code>die()</code>.</li>
    228           </ol>
    229         </SUBSECTION>
    230         <SUBSECTION title="Why?">
    231           <p>JavaScript requires statements to end with a semicolon, except when
    232             it thinks it can safely infer their existence. In each of these
    233             examples, a function declaration or object or array literal is used
    234             inside a statement. The closing brackets are not enough to signal
    235             the end of the statement. Javascript never ends a statement if the
    236             next token is an infix or bracket operator.</p>
    237           <p>This has really surprised people, so make sure your assignments end
    238             with semicolons.</p>
    239         </SUBSECTION>
    240         <SUBSECTION title="Clarification: Semicolons and functions">
    241           <p>Semicolons should be included at the end of function expressions,
    242             but not at the end of function declarations. The distinction is
    243             best illustrated with an example:</p>
    244           <CODE_SNIPPET>
    245             var foo = function() {
    246               return true;
    247             };  // semicolon here.
    248 
    249             function foo() {
    250               return true;
    251             }  // no semicolon here.
    252           </CODE_SNIPPET>
    253         </SUBSECTION>
    254       </BODY>
    255     </STYLEPOINT>
    256 
    257     <STYLEPOINT title="Nested functions">
    258       <SUMMARY>Yes</SUMMARY>
    259       <BODY>
    260         <p>Nested functions can be very useful, for example in the creation of
    261           continuations and for the task of hiding helper functions. Feel free
    262           to use them.</p>
    263       </BODY>
    264     </STYLEPOINT>
    265 
    266     <STYLEPOINT title="Function Declarations Within Blocks">
    267       <SUMMARY>No</SUMMARY>
    268       <BODY>
    269         <p>Do not do this:</p>
    270         <BAD_CODE_SNIPPET>
    271           if (x) {
    272             function foo() {}
    273           }
    274         </BAD_CODE_SNIPPET>
    275 
    276         <p>While most script engines support Function Declarations within blocks
    277           it is not part of ECMAScript (see
    278           <a href="http://www.ecma-international.org/publications/standards/Ecma-262.htm">ECMA-262</a>,
    279           clause 13 and 14). Worse implementations are inconsistent with each
    280           other and with future EcmaScript proposals. ECMAScript only allows for
    281           Function Declarations in the root statement list of a script or
    282           function. Instead use a variable initialized with a Function
    283           Expression to define a function within a block:</p>
    284         <CODE_SNIPPET>
    285            if (x) {
    286              var foo = function() {};
    287            }
    288         </CODE_SNIPPET>
    289       </BODY>
    290     </STYLEPOINT>
    291 
    292     <STYLEPOINT title="Exceptions">
    293       <SUMMARY>Yes</SUMMARY>
    294       <BODY>
    295         <p>You basically can't avoid exceptions if you're doing something
    296           non-trivial (using an application development framework, etc.).
    297           Go for it.</p>
    298       </BODY>
    299     </STYLEPOINT>
    300 
    301     <STYLEPOINT title="Custom exceptions">
    302       <SUMMARY>Yes</SUMMARY>
    303       <BODY>
    304         <p>Without custom exceptions, returning error information from a
    305           function that also returns a value can be tricky, not to mention
    306           inelegant.  Bad solutions include passing in a reference type to hold
    307           error information or always returning Objects with a potential
    308           error member.  These basically amount to a primitive exception
    309           handling hack. Feel free to use custom exceptions when
    310           appropriate.</p>
    311       </BODY>
    312     </STYLEPOINT>
    313 
    314     <STYLEPOINT title="Standards features">
    315       <SUMMARY>Always preferred over non-standards features</SUMMARY>
    316       <BODY>
    317         <p>For maximum portability and compatibility, always prefer standards
    318           features over non-standards features (e.g.,
    319           <code>string.charAt(3)</code> over <code>string[3]</code> and element
    320           access with DOM functions instead of using an application-specific
    321           shorthand).</p>
    322       </BODY>
    323     </STYLEPOINT>
    324 
    325     <STYLEPOINT title="Wrapper objects for primitive types">
    326       <SUMMARY>No</SUMMARY>
    327       <BODY>
    328         <p>There's no reason to use wrapper objects for primitive types, plus
    329           they're dangerous:</p>
    330         <BAD_CODE_SNIPPET>
    331           var x = new Boolean(false);
    332           if (x) {
    333             alert('hi');  // Shows 'hi'.
    334           }
    335         </BAD_CODE_SNIPPET>
    336         <p>Don't do it!</p>
    337         <p>However type casting is fine.</p>
    338         <CODE_SNIPPET>
    339           var x = Boolean(0);
    340           if (x) {
    341             alert('hi');  // This will never be alerted.
    342           }
    343           typeof Boolean(0) == 'boolean';
    344           typeof new Boolean(0) == 'object';
    345         </CODE_SNIPPET>
    346         <p>This is very useful for casting things to
    347           <code>number</code>, <code>string</code> and <code>boolean</code>.</p>
    348       </BODY>
    349     </STYLEPOINT>
    350 
    351     <STYLEPOINT title="Multi-level prototype hierarchies">
    352       <SUMMARY>Not preferred</SUMMARY>
    353       <BODY>
    354         <p>Multi-level prototype hierarchies are how JavaScript implements
    355           inheritance. You have a multi-level hierarchy if you have a
    356           user-defined class D with another user-defined class B as its
    357           prototype. These hierarchies are much harder to get right than they
    358           first appear! </p>
    359 
    360         <p>For that reason, it is best to use <code>goog.inherits()</code> from
    361           <a href="https://code.google.com/closure/library/">
    362             the Closure Library
    363           </a>
    364           or a similar library function.
    365         </p>
    366         <CODE_SNIPPET>
    367           function D() {
    368             goog.base(this)
    369           }
    370           goog.inherits(D, B);
    371 
    372           D.prototype.method = function() {
    373             ...
    374           };
    375         </CODE_SNIPPET>
    376       </BODY>
    377     </STYLEPOINT>
    378 
    379     <STYLEPOINT title="Method and property definitions">
    380       <SUMMARY><code>/** @constructor */
    381         function SomeConstructor() {
    382           this.someProperty = 1;
    383         }
    384         Foo.prototype.someMethod = function() { ... };</code></SUMMARY>
    385       <BODY>
    386         <p>While there are several ways to attach methods and properties to an
    387           object created via "new", the preferred style for methods
    388           is:</p>
    389         <CODE_SNIPPET>
    390           Foo.prototype.bar = function() {
    391             /* ... */
    392           };
    393         </CODE_SNIPPET>
    394         <p>The preferred style for other properties is to initialize the field
    395           in the constructor:</p>
    396         <CODE_SNIPPET>
    397           /** @constructor */
    398           function Foo() {
    399             this.bar = value;
    400           }
    401         </CODE_SNIPPET>
    402         <SUBSECTION title="Why?">
    403           <p>Current JavaScript engines optimize based on the "shape"
    404             of an object, <a href="https://developers.google.com/v8/design#prop_access">
    405             adding a property to an object (including overriding
    406             a value set on the prototype) changes the shape and can degrade
    407             performance.</a></p>
    408         </SUBSECTION>
    409       </BODY>
    410     </STYLEPOINT>
    411 
    412     <STYLEPOINT title="delete">
    413       <SUMMARY>Prefer <code>this.foo = null</code>.</SUMMARY>
    414       <BODY>
    415         <CODE_SNIPPET>
    416           Foo.prototype.dispose = function() {
    417             this.property_ = null;
    418           };
    419         </CODE_SNIPPET>
    420         <p>Instead of:</p>
    421         <BAD_CODE_SNIPPET>
    422           Foo.prototype.dispose = function() {
    423             delete this.property_;
    424           };
    425         </BAD_CODE_SNIPPET>
    426         <p>In modern JavaScript engines, changing the number of properties on an
    427           object is much slower than reassigning the values. The delete keyword
    428           should be avoided except when it is necessary to remove a property
    429           from an object's iterated list of keys, or to change the result of
    430           <code>if (key in obj)</code>.</p>
    431       </BODY>
    432     </STYLEPOINT>
    433 
    434     <STYLEPOINT title="Closures">
    435       <SUMMARY>Yes, but be careful.</SUMMARY>
    436       <BODY>
    437         <p>The ability to create closures is perhaps the most useful and often
    438           overlooked feature of JS. Here is
    439           <a href="http://jibbering.com/faq/faq_notes/closures.html">
    440             a good description of how closures work</a>.</p>
    441         <p>One thing to keep in mind, however, is that a closure keeps a pointer
    442           to its enclosing scope. As a result, attaching a closure to a DOM
    443           element can create a circular reference and thus, a memory leak. For
    444           example, in the following code:</p>
    445         <BAD_CODE_SNIPPET>
    446           function foo(element, a, b) {
    447             element.onclick = function() { /* uses a and b */ };
    448           }
    449         </BAD_CODE_SNIPPET>
    450         <p>the function closure keeps a reference to <code>element</code>,
    451           <code>a</code>, and <code>b</code> even if it never uses
    452           <code>element</code>. Since <code>element</code> also keeps a
    453           reference to the closure, we have a cycle that won't be cleaned up by
    454           garbage collection. In these situations, the code can be structured
    455           as follows:</p>
    456         <CODE_SNIPPET>
    457           function foo(element, a, b) {
    458             element.onclick = bar(a, b);
    459           }
    460 
    461           function bar(a, b) {
    462             return function() { /* uses a and b */ };
    463           }
    464         </CODE_SNIPPET>
    465       </BODY>
    466     </STYLEPOINT>
    467 
    468     <STYLEPOINT title="eval()">
    469       <SUMMARY>
    470         Only for code loaders and REPL (Readevalprint loop)
    471       </SUMMARY>
    472       <BODY>
    473         <p><code>eval()</code> makes for confusing semantics and is dangerous
    474           to use if the string being <code>eval()</code>'d contains user input.
    475           There's usually a better, clearer, and safer way to write your code,
    476           so its use is generally not permitted.</p>
    477 
    478         <p>For RPC you can always use JSON and read the result using
    479           <code>JSON.parse()</code> instead of <code>eval()</code>.</p>
    480 
    481         <p>Let's assume we have a server that returns something like this:</p>
    482 
    483         <CODE_SNIPPET>
    484           {
    485             "name": "Alice",
    486             "id": 31502,
    487             "email": "looking_glass (a] example.com"
    488           }
    489         </CODE_SNIPPET>
    490 
    491         <BAD_CODE_SNIPPET>
    492           var userInfo = eval(feed);
    493           var email = userInfo['email'];
    494         </BAD_CODE_SNIPPET>
    495 
    496         <p>If the feed was modified to include malicious JavaScript code, then
    497           if we use <code>eval</code> then that code will be executed.</p>
    498 
    499         <CODE_SNIPPET>
    500           var userInfo = JSON.parse(feed);
    501           var email = userInfo['email'];
    502         </CODE_SNIPPET>
    503 
    504         <p>With <code>JSON.parse</code>, invalid JSON (including all executable
    505           JavaScript) will cause an exception to be thrown.</p>
    506 
    507       </BODY>
    508     </STYLEPOINT>
    509 
    510     <STYLEPOINT title="with() {}">
    511       <SUMMARY>No</SUMMARY>
    512       <BODY>
    513         <p>Using <code>with</code> clouds the semantics of your program.
    514           Because the object of the <code>with</code> can have properties that
    515           collide with local variables, it can drastically change the meaning
    516           of your program. For example, what does this do?</p>
    517         <BAD_CODE_SNIPPET>
    518           with (foo) {
    519             var x = 3;
    520             return x;
    521           }
    522         </BAD_CODE_SNIPPET>
    523         <p>Answer: anything. The local variable <code>x</code> could be
    524           clobbered by a property of <code>foo</code> and perhaps it even has
    525           a setter, in which case assigning <code>3</code> could cause lots of
    526           other code to execute. Don't use <code>with</code>.</p>
    527       </BODY>
    528     </STYLEPOINT>
    529 
    530     <STYLEPOINT title="this">
    531       <SUMMARY>
    532         Only in object constructors, methods, and in setting up closures
    533       </SUMMARY>
    534       <BODY>
    535         <p>The semantics of <code>this</code> can be tricky. At times it refers
    536           to the global object (in most places), the scope of the caller (in
    537           <code>eval</code>), a node in the DOM tree (when attached using an
    538           event handler HTML attribute), a newly created object (in a
    539           constructor), or some other object (if function was
    540           <code>call()</code>ed or <code>apply()</code>ed).</p>
    541         <p>Because this is so easy to get wrong, limit its use to those places
    542           where it is required:</p>
    543         <ul>
    544           <li>in constructors</li>
    545           <li>in methods of objects (including in the creation of closures)</li>
    546         </ul>
    547       </BODY>
    548     </STYLEPOINT>
    549 
    550     <STYLEPOINT title="for-in loop">
    551       <SUMMARY>
    552         Only for iterating over keys in an object/map/hash
    553       </SUMMARY>
    554       <BODY>
    555         <p><code>for-in</code> loops are often incorrectly used to loop over
    556           the elements in an <code>Array</code>. This is however very error
    557           prone because it does not loop from <code>0</code> to
    558           <code>length - 1</code> but over all the present keys in the object
    559           and its prototype chain. Here are a few cases where it fails:</p>
    560         <BAD_CODE_SNIPPET>
    561           function printArray(arr) {
    562             for (var key in arr) {
    563               print(arr[key]);
    564             }
    565           }
    566 
    567           printArray([0,1,2,3]);  // This works.
    568 
    569           var a = new Array(10);
    570           printArray(a);  // This is wrong.
    571 
    572           a = document.getElementsByTagName('*');
    573           printArray(a);  // This is wrong.
    574 
    575           a = [0,1,2,3];
    576           a.buhu = 'wine';
    577           printArray(a);  // This is wrong again.
    578 
    579           a = new Array;
    580           a[3] = 3;
    581           printArray(a);  // This is wrong again.
    582         </BAD_CODE_SNIPPET>
    583         <p>Always use normal for loops when using arrays.</p>
    584         <CODE_SNIPPET>
    585           function printArray(arr) {
    586             var l = arr.length;
    587             for (var i = 0; i &lt; l; i++) {
    588               print(arr[i]);
    589             }
    590           }
    591         </CODE_SNIPPET>
    592       </BODY>
    593     </STYLEPOINT>
    594 
    595     <STYLEPOINT title="Associative Arrays">
    596       <SUMMARY>
    597         Never use <code>Array</code> as a map/hash/associative array
    598       </SUMMARY>
    599       <BODY>
    600         <p>Associative <code>Array</code>s are not allowed... or more precisely
    601           you are not allowed to use non number indexes for arrays. If you need
    602           a map/hash use <code>Object</code> instead of <code>Array</code> in
    603           these cases because the features that you want are actually features
    604           of <code>Object</code> and not of <code>Array</code>.
    605           <code>Array</code> just happens to extend <code>Object</code> (like
    606           any other object in JS and therefore you might as well have used
    607           <code>Date</code>, <code>RegExp</code> or <code>String</code>).</p>
    608       </BODY>
    609     </STYLEPOINT>
    610 
    611     <STYLEPOINT title="Multiline string literals">
    612       <SUMMARY>No</SUMMARY>
    613       <BODY>
    614         <p>Do not do this:</p>
    615         <BAD_CODE_SNIPPET>
    616           var myString = 'A rather long string of English text, an error message \
    617                           actually that just keeps going and going -- an error \
    618                           message to make the Energizer bunny blush (right through \
    619                           those Schwarzenegger shades)! Where was I? Oh yes, \
    620                           you\'ve got an error and all the extraneous whitespace is \
    621                           just gravy.  Have a nice day.';
    622         </BAD_CODE_SNIPPET>
    623         <p>The whitespace at the beginning of each line can't be safely stripped
    624           at compile time; whitespace after the slash will result in tricky
    625           errors. </p>
    626         <p>Use string concatenation instead:</p>
    627         <CODE_SNIPPET>
    628           var myString = 'A rather long string of English text, an error message ' +
    629               'actually that just keeps going and going -- an error ' +
    630               'message to make the Energizer bunny blush (right through ' +
    631               'those Schwarzenegger shades)! Where was I? Oh yes, ' +
    632               'you\'ve got an error and all the extraneous whitespace is ' +
    633               'just gravy.  Have a nice day.';
    634         </CODE_SNIPPET>
    635       </BODY>
    636     </STYLEPOINT>
    637 
    638     <STYLEPOINT title="Array and Object literals">
    639       <SUMMARY>Yes</SUMMARY>
    640       <BODY>
    641         <p>Use <code>Array</code> and <code>Object</code> literals instead of
    642           <code>Array</code> and <code>Object</code> constructors.</p>
    643         <p>Array constructors are error-prone due to their arguments.</p>
    644         <BAD_CODE_SNIPPET>
    645           // Length is 3.
    646           var a1 = new Array(x1, x2, x3);
    647 
    648           // Length is 2.
    649           var a2 = new Array(x1, x2);
    650 
    651           // If x1 is a number and it is a natural number the length will be x1.
    652           // If x1 is a number but not a natural number this will throw an exception.
    653           // Otherwise the array will have one element with x1 as its value.
    654           var a3 = new Array(x1);
    655 
    656           // Length is 0.
    657           var a4 = new Array();
    658         </BAD_CODE_SNIPPET>
    659         <p>Because of this, if someone changes the code to pass 1 argument
    660           instead of 2 arguments, the array might not have the expected
    661           length.</p>
    662         <p>To avoid these kinds of weird cases, always use the more readable
    663           array literal.</p>
    664         <CODE_SNIPPET>
    665           var a = [x1, x2, x3];
    666           var a2 = [x1, x2];
    667           var a3 = [x1];
    668           var a4 = [];
    669         </CODE_SNIPPET>
    670         <p>Object constructors don't have the same problems, but for readability
    671           and consistency object literals should be used.</p>
    672         <BAD_CODE_SNIPPET>
    673           var o = new Object();
    674 
    675           var o2 = new Object();
    676           o2.a = 0;
    677           o2.b = 1;
    678           o2.c = 2;
    679           o2['strange key'] = 3;
    680         </BAD_CODE_SNIPPET>
    681         <p>Should be written as:</p>
    682         <CODE_SNIPPET>
    683           var o = {};
    684 
    685           var o2 = {
    686             a: 0,
    687             b: 1,
    688             c: 2,
    689             'strange key': 3
    690           };
    691         </CODE_SNIPPET>
    692       </BODY>
    693     </STYLEPOINT>
    694 
    695     <STYLEPOINT title="Modifying prototypes of builtin objects">
    696       <SUMMARY>No</SUMMARY>
    697       <BODY>
    698         <p>Modifying builtins like <code>Object.prototype</code> and
    699           <code>Array.prototype</code> are strictly forbidden.  Modifying other
    700           builtins like <code>Function.prototype</code> is less dangerous but
    701           still leads to hard to debug issues in production and should be
    702           avoided.</p>
    703       </BODY>
    704     </STYLEPOINT>
    705 
    706     <STYLEPOINT title="Internet Explorer's Conditional Comments">
    707       <SUMMARY>No</SUMMARY>
    708       <BODY>
    709         <p>Don't do this:</p>
    710         <BAD_CODE_SNIPPET>
    711         var f = function () {
    712             /*@cc_on if (@_jscript) { return 2* @*/  3; /*@ } @*/
    713         };
    714         </BAD_CODE_SNIPPET>
    715         <p>Conditional Comments hinder automated tools as they can vary the
    716         JavaScript syntax tree at runtime.</p>
    717       </BODY>
    718     </STYLEPOINT>
    719   </CATEGORY>
    720 
    721   <CATEGORY title="JavaScript Style Rules">
    722     <STYLEPOINT title="Naming">
    723       <SUMMARY>
    724         <p>In general, use
    725           <code>functionNamesLikeThis</code>,
    726           <code>variableNamesLikeThis</code>,
    727           <code>ClassNamesLikeThis</code>,
    728           <code>EnumNamesLikeThis</code>,
    729           <code>methodNamesLikeThis</code>,
    730           <code>CONSTANT_VALUES_LIKE_THIS</code>,
    731           <code>foo.namespaceNamesLikeThis.bar</code>, and
    732           <code>filenameslikethis.js</code>.
    733         </p>
    734       </SUMMARY>
    735       <BODY>
    736         <SUBSECTION title="Properties and methods">
    737           <ul>
    738             <li><em>Private</em> properties and methods should be named with a
    739               trailing underscore.
    740               </li>
    741             <li><em>Protected</em> properties and methods should be
    742               named without a trailing underscore (like public ones).</li>
    743           </ul>
    744           <p>For more information on <em>private</em> and <em>protected</em>,
    745             read the section on
    746             <a href="#Visibility__private_and_protected_fields_">
    747               visibility</a>.
    748             </p>
    749 
    750 
    751 
    752 
    753         </SUBSECTION>
    754 
    755         <SUBSECTION title="Method and function parameter">
    756           <p>Optional function arguments start with <code>opt_</code>.</p>
    757           <p>Functions that take a variable number of arguments should have the
    758             last argument named <code>var_args</code>. You may not refer to
    759             <code>var_args</code> in the code; use the <code>arguments</code>
    760             array.</p>
    761           <p>Optional and variable arguments can also be specified in
    762             <code>@param</code> annotations. Although either convention is
    763             acceptable to the compiler, using both together is preferred.</p>
    764 
    765         </SUBSECTION>
    766 
    767         <SUBSECTION title="Getters and Setters">
    768           <p>EcmaScript 5 getters and setters for properties are discouraged.
    769             However, if they are used, then getters must not change observable
    770             state.</p>
    771             <BAD_CODE_SNIPPET>
    772               /**
    773                * WRONG -- Do NOT do this.
    774                */
    775               var foo = { get next() { return this.nextId++; } };
    776             </BAD_CODE_SNIPPET>
    777         </SUBSECTION>
    778 
    779         <SUBSECTION title="Accessor functions">
    780           <p>Getters and setters methods for properties are not required.
    781             However, if they are used, then getters must be named
    782             <code>getFoo()</code> and setters must be named
    783             <code>setFoo(value)</code>. (For boolean getters,
    784             <code>isFoo()</code> is also acceptable, and often sounds more
    785             natural.)</p>
    786         </SUBSECTION>
    787 
    788         <SUBSECTION title="Namespaces">
    789           <p>JavaScript has no inherent packaging or namespacing support.</p>
    790           <p>Global name conflicts are difficult to debug, and can cause
    791             intractable problems when two projects try to integrate. In order
    792             to make it possible to share common JavaScript code, we've adopted
    793             conventions to prevent collisions. </p>
    794           <SUBSUBSECTION title="Use namespaces for global code">
    795             <p><em>ALWAYS</em> prefix identifiers in the global scope with a
    796               unique pseudo namespace related to the project or library. If you
    797               are working on "Project Sloth", a reasonable pseudo namespace
    798               would be <code>sloth.*</code>.</p>
    799             <CODE_SNIPPET>
    800               var sloth = {};
    801 
    802               sloth.sleep = function() {
    803                 ...
    804               };
    805             </CODE_SNIPPET>
    806 
    807 
    808             <p>Many JavaScript libraries, including
    809               <a href="https://code.google.com/closure/library/">
    810                 the Closure Library
    811               </a>
    812               and
    813               <a href="http://www.dojotoolkit.org/">
    814                 Dojo toolkit
    815               </a>
    816               give you high-level functions for declaring your namespaces.
    817               Be consistent about how you declare your namespaces.</p>
    818             <CODE_SNIPPET>
    819               goog.provide('sloth');
    820 
    821               sloth.sleep = function() {
    822                 ...
    823               };
    824             </CODE_SNIPPET>
    825           </SUBSUBSECTION>
    826           <SUBSUBSECTION title="Respect namespace ownership">
    827             <p>When choosing a child-namespace, make sure that the owners of the
    828               parent namespace know what you are doing. If you start a project
    829               that creates hats for sloths, make sure that the Sloth team knows
    830               that you're using <code>sloth.hats</code>.</p>
    831 
    832           </SUBSUBSECTION>
    833           <SUBSUBSECTION title="Use different namespaces for external code and internal code">
    834             <p>"External code" is code that comes from outside your codebase,
    835               and is compiled independently. Internal and external names should
    836               be kept strictly separate. If you're using an external library
    837               that makes things available in <code>foo.hats.*</code>, your
    838               internal code should not define all its symbols in
    839               <code>foo.hats.*</code>, because it will break if the other
    840               team defines new symbols.</p>
    841             <BAD_CODE_SNIPPET>
    842               foo.require('foo.hats');
    843 
    844               /**
    845                * WRONG -- Do NOT do this.
    846                * @constructor
    847                * @extends {foo.hats.RoundHat}
    848                */
    849               foo.hats.BowlerHat = function() {
    850               };
    851             </BAD_CODE_SNIPPET>
    852             <p>If you need to define new APIs on an external namespace, then you
    853               should explicitly export the public API functions, and only those
    854               functions. Your internal code should call the internal APIs by
    855               their internal names, for consistency and so that the compiler
    856               can optimize them better.</p>
    857             <CODE_SNIPPET>
    858               foo.provide('googleyhats.BowlerHat');
    859 
    860               foo.require('foo.hats');
    861 
    862               /**
    863                * @constructor
    864                * @extends {foo.hats.RoundHat}
    865                */
    866               googleyhats.BowlerHat = function() {
    867                 ...
    868               };
    869 
    870               goog.exportSymbol('foo.hats.BowlerHat', googleyhats.BowlerHat);
    871             </CODE_SNIPPET>
    872 
    873 
    874           </SUBSUBSECTION>
    875           <SUBSUBSECTION title="Alias long type names to improve readability">
    876             <p>Use local aliases for fully-qualified types if doing so improves
    877               readability. The name of a local alias should match the last part
    878               of the type.</p>
    879             <CODE_SNIPPET>
    880               /**
    881                * @constructor
    882                */
    883               some.long.namespace.MyClass = function() {
    884               };
    885 
    886               /**
    887                * @param {some.long.namespace.MyClass} a
    888                */
    889               some.long.namespace.MyClass.staticHelper = function(a) {
    890                 ...
    891               };
    892 
    893               myapp.main = function() {
    894                 var MyClass = some.long.namespace.MyClass;
    895                 var staticHelper = some.long.namespace.MyClass.staticHelper;
    896                 staticHelper(new MyClass());
    897               };
    898             </CODE_SNIPPET>
    899             <p>Do not create local aliases of namespaces. Namespaces should only
    900               be aliased using <a href="#goog-scope">goog.scope</a>.</p>
    901             <BAD_CODE_SNIPPET>
    902               myapp.main = function() {
    903                 var namespace = some.long.namespace;
    904                 namespace.MyClass.staticHelper(new namespace.MyClass());
    905               };
    906             </BAD_CODE_SNIPPET>
    907             <p>Avoid accessing properties of an aliased type, unless it is an
    908               enum.</p>
    909             <CODE_SNIPPET>
    910               /** @enum {string} */
    911               some.long.namespace.Fruit = {
    912                 APPLE: 'a',
    913                 BANANA: 'b'
    914               };
    915 
    916               myapp.main = function() {
    917                 var Fruit = some.long.namespace.Fruit;
    918                 switch (fruit) {
    919                   case Fruit.APPLE:
    920                     ...
    921                   case Fruit.BANANA:
    922                     ...
    923                 }
    924               };
    925             </CODE_SNIPPET>
    926             <BAD_CODE_SNIPPET>
    927               myapp.main = function() {
    928                 var MyClass = some.long.namespace.MyClass;
    929                 MyClass.staticHelper(null);
    930               };
    931             </BAD_CODE_SNIPPET>
    932             <p>Never create aliases in the global scope. Use them only in
    933               function blocks.</p>
    934           </SUBSUBSECTION>
    935         </SUBSECTION>
    936         <SUBSECTION title="Filenames">
    937           <p>Filenames should be all lowercase in order to avoid confusion on
    938             case-sensitive platforms. Filenames should end in <code>.js</code>,
    939             and should contain no punctuation except for <code>-</code> or
    940             <code>_</code> (prefer <code>-</code> to <code>_</code>).</p>
    941         </SUBSECTION>
    942 
    943       </BODY>
    944     </STYLEPOINT>
    945 
    946     <STYLEPOINT title="Custom toString() methods">
    947       <SUMMARY>
    948         Must always succeed without side effects.
    949       </SUMMARY>
    950       <BODY>
    951         <p>You can control how your objects string-ify themselves by defining a
    952           custom <code>toString()</code> method. This is fine, but you need
    953           to ensure that your method (1) always succeeds and (2) does not have
    954           side-effects. If your method doesn't meet these criteria, it's very
    955           easy to run into serious problems. For example, if
    956           <code>toString()</code> calls a method that does an
    957           <code>assert</code>, <code>assert</code> might try to output the name
    958           of the object in which it failed, which of course requires calling
    959           <code>toString()</code>.</p>
    960       </BODY>
    961     </STYLEPOINT>
    962 
    963     <STYLEPOINT title="Deferred initialization">
    964       <SUMMARY>OK</SUMMARY>
    965       <BODY>
    966         <p>It isn't always possible to initialize variables at the point of
    967           declaration, so deferred initialization is fine.</p>
    968       </BODY>
    969     </STYLEPOINT>
    970 
    971     <STYLEPOINT title="Explicit scope">
    972       <SUMMARY>Always</SUMMARY>
    973       <BODY>
    974         <p>Always use explicit scope - doing so increases portability and
    975           clarity. For example, don't rely on <code>window</code> being in the
    976           scope chain. You might want to use your function in another
    977           application for which <code>window</code> is not the content
    978           window.</p>
    979       </BODY>
    980     </STYLEPOINT>
    981 
    982     <STYLEPOINT title="Code formatting">
    983       <SUMMARY>Expand for more information.</SUMMARY>
    984       <BODY>
    985         <p>We follow the <a href="cppguide.html#Formatting">C++ formatting
    986           rules</a> in spirit, with the following additional clarifications.</p>
    987         <SUBSECTION title="Curly Braces">
    988           <p>Because of implicit semicolon insertion, always start your curly
    989             braces on the same line as whatever they're opening.  For
    990             example:</p>
    991           <CODE_SNIPPET>
    992             if (something) {
    993               // ...
    994             } else {
    995               // ...
    996             }
    997           </CODE_SNIPPET>
    998         </SUBSECTION>
    999         <SUBSECTION title="Array and Object Initializers">
   1000           <p>Single-line array and object initializers are allowed when they
   1001             fit on a line:</p>
   1002           <CODE_SNIPPET>
   1003             var arr = [1, 2, 3];  // No space after [ or before ].
   1004             var obj = {a: 1, b: 2, c: 3};  // No space after { or before }.
   1005           </CODE_SNIPPET>
   1006           <p>Multiline array initializers and object initializers are indented
   1007             2 spaces, with the braces on their own line, just like blocks.</p>
   1008           <CODE_SNIPPET>
   1009             // Object initializer.
   1010             var inset = {
   1011               top: 10,
   1012               right: 20,
   1013               bottom: 15,
   1014               left: 12
   1015             };
   1016 
   1017             // Array initializer.
   1018             this.rows_ = [
   1019               '"Slartibartfast" &lt;fjordmaster (a] magrathea.com&gt;',
   1020               '"Zaphod Beeblebrox" &lt;theprez (a] universe.gov&gt;',
   1021               '"Ford Prefect" &lt;ford (a] theguide.com&gt;',
   1022               '"Arthur Dent" &lt;has.no.tea (a] gmail.com&gt;',
   1023               '"Marvin the Paranoid Android" &lt;marv (a] googlemail.com&gt;',
   1024               'the.mice (a] magrathea.com'
   1025             ];
   1026 
   1027             // Used in a method call.
   1028             goog.dom.createDom(goog.dom.TagName.DIV, {
   1029               id: 'foo',
   1030               className: 'some-css-class',
   1031               style: 'display:none'
   1032             }, 'Hello, world!');
   1033           </CODE_SNIPPET>
   1034           <p>Long identifiers or values present problems for aligned
   1035             initialization lists, so always prefer non-aligned initialization.
   1036             For example:</p>
   1037           <CODE_SNIPPET>
   1038             CORRECT_Object.prototype = {
   1039               a: 0,
   1040               b: 1,
   1041               lengthyName: 2
   1042             };
   1043           </CODE_SNIPPET>
   1044           <p>Not like this:</p>
   1045           <BAD_CODE_SNIPPET>
   1046             WRONG_Object.prototype = {
   1047               a          : 0,
   1048               b          : 1,
   1049               lengthyName: 2
   1050             };
   1051           </BAD_CODE_SNIPPET>
   1052         </SUBSECTION>
   1053         <SUBSECTION title="Function Arguments">
   1054           <p>When possible, all function arguments should be listed on the same
   1055             line. If doing so would exceed the 80-column limit, the arguments
   1056             must be line-wrapped in a readable way. To save space, you may wrap
   1057             as close to 80 as possible, or put each argument on its own line to
   1058             enhance readability. The indentation may be either four spaces, or
   1059             aligned to the parenthesis. Below are the most common patterns for
   1060             argument wrapping:</p>
   1061           <CODE_SNIPPET>
   1062             // Four-space, wrap at 80.  Works with very long function names, survives
   1063             // renaming without reindenting, low on space.
   1064             goog.foo.bar.doThingThatIsVeryDifficultToExplain = function(
   1065                 veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo,
   1066                 tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) {
   1067               // ...
   1068             };
   1069 
   1070             // Four-space, one argument per line.  Works with long function names,
   1071             // survives renaming, and emphasizes each argument.
   1072             goog.foo.bar.doThingThatIsVeryDifficultToExplain = function(
   1073                 veryDescriptiveArgumentNumberOne,
   1074                 veryDescriptiveArgumentTwo,
   1075                 tableModelEventHandlerProxy,
   1076                 artichokeDescriptorAdapterIterator) {
   1077               // ...
   1078             };
   1079 
   1080             // Parenthesis-aligned indentation, wrap at 80.  Visually groups arguments,
   1081             // low on space.
   1082             function foo(veryDescriptiveArgumentNumberOne, veryDescriptiveArgumentTwo,
   1083                          tableModelEventHandlerProxy, artichokeDescriptorAdapterIterator) {
   1084               // ...
   1085             }
   1086 
   1087             // Parenthesis-aligned, one argument per line.  Emphasizes each
   1088             // individual argument.
   1089             function bar(veryDescriptiveArgumentNumberOne,
   1090                          veryDescriptiveArgumentTwo,
   1091                          tableModelEventHandlerProxy,
   1092                          artichokeDescriptorAdapterIterator) {
   1093               // ...
   1094             }
   1095           </CODE_SNIPPET>
   1096           <p>When the function call is itself indented, you're free to start the
   1097           4-space indent relative to the beginning of the original statement
   1098           or relative to the beginning of the current function call.
   1099           The following are all acceptable indentation styles.</p>
   1100           <CODE_SNIPPET>
   1101             if (veryLongFunctionNameA(
   1102                     veryLongArgumentName) ||
   1103                 veryLongFunctionNameB(
   1104                 veryLongArgumentName)) {
   1105               veryLongFunctionNameC(veryLongFunctionNameD(
   1106                   veryLongFunctioNameE(
   1107                       veryLongFunctionNameF)));
   1108             }
   1109           </CODE_SNIPPET>
   1110         </SUBSECTION>
   1111         <SUBSECTION title="Passing Anonymous Functions">
   1112           <p>When declaring an anonymous function in the list of arguments for
   1113             a function call, the body of the function is indented two spaces
   1114             from the left edge of the statement, or two spaces from the left
   1115             edge of the function keyword. This is to make the body of the
   1116             anonymous function easier to read (i.e. not be all squished up into
   1117             the right half of the screen).</p>
   1118           <CODE_SNIPPET>
   1119             prefix.something.reallyLongFunctionName('whatever', function(a1, a2) {
   1120               if (a1.equals(a2)) {
   1121                 someOtherLongFunctionName(a1);
   1122               } else {
   1123                 andNowForSomethingCompletelyDifferent(a2.parrot);
   1124               }
   1125             });
   1126 
   1127             var names = prefix.something.myExcellentMapFunction(
   1128                 verboselyNamedCollectionOfItems,
   1129                 function(item) {
   1130                   return item.name;
   1131                 });
   1132           </CODE_SNIPPET>
   1133         </SUBSECTION>
   1134         <SUBSECTION title="Aliasing with goog.scope">
   1135           <a name="goog-scope"/>
   1136           <p>
   1137             <a href="https://docs.google.com/document/pub?id=1ETFAuh2kaXMVL-vafUYhaWlhl6b5D9TOvboVg7Zl68Y"><code>goog.scope</code></a>
   1138             may be used to shorten references to
   1139             namespaced symbols in programs using
   1140             <a href="https://code.google.com/closure/library/">the Closure
   1141               Library</a>.</p>
   1142           <p>Only one <code>goog.scope</code> invocation may be added per
   1143             file.  Always place it in the global scope.</p>
   1144           <p>The opening <code>goog.scope(function() {</code> invocation
   1145             must be preceded by exactly one blank line and follow any
   1146             <code>goog.provide</code> statements, <code>goog.require</code>
   1147             statements, or top-level comments.  The invocation must be closed on
   1148             the last line in the file.  Append <code>// goog.scope</code> to the
   1149             closing statement of the scope. Separate the comment from the
   1150             semicolon by two spaces.</p>
   1151           <p>Similar to C++ namespaces, do not indent under goog.scope
   1152             declarations. Instead, continue from the 0 column.</p>
   1153           <p>Only alias names that will not be re-assigned to another object
   1154             (e.g., most constructors, enums, and namespaces). Do not do
   1155             this (see below for how to alias a constructor):</p>
   1156 
   1157           <BAD_CODE_SNIPPET>
   1158             goog.scope(function() {
   1159             var Button = goog.ui.Button;
   1160 
   1161             Button = function() { ... };
   1162             ...
   1163           </BAD_CODE_SNIPPET>
   1164 
   1165           <p>Names must be the same as the last property of the global that they
   1166             are aliasing.</p>
   1167 
   1168           <CODE_SNIPPET>
   1169             goog.provide('my.module.SomeType');
   1170 
   1171             goog.require('goog.dom');
   1172             goog.require('goog.ui.Button');
   1173 
   1174             goog.scope(function() {
   1175             var Button = goog.ui.Button;
   1176             var dom = goog.dom;
   1177 
   1178             // Alias new types <b>after</b> the constructor declaration.
   1179             my.module.SomeType = function() { ... };
   1180             var SomeType = my.module.SomeType;
   1181 
   1182             // Declare methods on the prototype as usual:
   1183             SomeType.prototype.findButton = function() {
   1184               // Button as aliased above.
   1185               this.button = new Button(dom.getElement('my-button'));
   1186             };
   1187             ...
   1188             });  // goog.scope
   1189           </CODE_SNIPPET>
   1190         </SUBSECTION>
   1191         <SUBSECTION title="Indenting wrapped lines">
   1192           <p>Except for <a href="#Array_and_Object_literals">array literals,
   1193             object literals</a>, and anonymous functions, all wrapped lines
   1194             should be indented either left-aligned to a sibling expression
   1195             above, or four spaces (not two spaces) deeper than a parent
   1196             expression (where "sibling" and "parent" refer to parenthesis
   1197             nesting level).
   1198           </p>
   1199 
   1200           <CODE_SNIPPET>
   1201             someWonderfulHtml = '<div class="' + getClassesForWonderfulHtml()'">' +
   1202                                 getEvenMoreHtml(someReallyInterestingValues, moreValues,
   1203                                                 evenMoreParams, 'a duck', true, 72,
   1204                                                 slightlyMoreMonkeys(0xfff)) +
   1205                                 '</div>';
   1206 
   1207             thisIsAVeryLongVariableName =
   1208                 hereIsAnEvenLongerOtherFunctionNameThatWillNotFitOnPrevLine();
   1209 
   1210             thisIsAVeryLongVariableName = siblingOne + siblingTwo + siblingThree +
   1211                 siblingFour + siblingFive + siblingSix + siblingSeven +
   1212                 moreSiblingExpressions + allAtTheSameIndentationLevel;
   1213 
   1214             thisIsAVeryLongVariableName = operandOne + operandTwo + operandThree +
   1215                 operandFour + operandFive * (
   1216                     aNestedChildExpression + shouldBeIndentedMore);
   1217 
   1218             someValue = this.foo(
   1219                 shortArg,
   1220                 'Some really long string arg - this is a pretty common case, actually.',
   1221                 shorty2,
   1222                 this.bar());
   1223 
   1224             if (searchableCollection(allYourStuff).contains(theStuffYouWant) &amp;&amp;
   1225                 !ambientNotification.isActive() &amp;&amp; (client.isAmbientSupported() ||
   1226                                                     client.alwaysTryAmbientAnyways())) {
   1227               ambientNotification.activate();
   1228             }
   1229           </CODE_SNIPPET>
   1230         </SUBSECTION>
   1231         <SUBSECTION title="Blank lines">
   1232           <p>Use newlines to group logically related pieces of code.
   1233             For example:</p>
   1234           <CODE_SNIPPET>
   1235             doSomethingTo(x);
   1236             doSomethingElseTo(x);
   1237             andThen(x);
   1238 
   1239             nowDoSomethingWith(y);
   1240 
   1241             andNowWith(z);
   1242           </CODE_SNIPPET>
   1243         </SUBSECTION>
   1244         <SUBSECTION title="Binary and Ternary Operators">
   1245           <p>Always put the operator on the preceding line. Otherwise,
   1246             line breaks and indentation follow the same rules as in other
   1247             Google style guides. This operator placement was initially agreed
   1248             upon out of concerns about automatic semicolon insertion. In fact,
   1249             semicolon insertion cannot happen before a binary operator, but new
   1250             code should stick to this style for consistency.</p>
   1251           <CODE_SNIPPET>
   1252             var x = a ? b : c;  // All on one line if it will fit.
   1253 
   1254             // Indentation +4 is OK.
   1255             var y = a ?
   1256                 longButSimpleOperandB : longButSimpleOperandC;
   1257 
   1258             // Indenting to the line position of the first operand is also OK.
   1259             var z = a ?
   1260                     moreComplicatedB :
   1261                     moreComplicatedC;
   1262           </CODE_SNIPPET>
   1263           <p>This includes the dot operator.</p>
   1264           <CODE_SNIPPET>
   1265             var x = foo.bar().
   1266                 doSomething().
   1267                 doSomethingElse();
   1268           </CODE_SNIPPET>
   1269         </SUBSECTION>
   1270       </BODY>
   1271     </STYLEPOINT>
   1272 
   1273     <STYLEPOINT title="Parentheses">
   1274       <SUMMARY>Only where required</SUMMARY>
   1275       <BODY>
   1276         <p>Use sparingly and in general only where required by the syntax
   1277           and semantics.</p>
   1278         <p>Never use parentheses for unary operators such as
   1279           <code>delete</code>, <code>typeof</code> and <code>void</code> or
   1280           after keywords such as <code>return</code>, <code>throw</code> as
   1281           well as others (<code>case</code>, <code>in</code> or
   1282           <code>new</code>).</p>
   1283       </BODY>
   1284     </STYLEPOINT>
   1285 
   1286     <STYLEPOINT title="Strings">
   1287       <SUMMARY>Prefer ' over "</SUMMARY>
   1288       <BODY>
   1289         <p>For consistency single-quotes (') are preferred to double-quotes (").
   1290           This is helpful when creating strings that include HTML:</p>
   1291         <CODE_SNIPPET>
   1292           var msg = 'This is <a href="http://foo">some HTML</a>';
   1293         </CODE_SNIPPET>
   1294       </BODY>
   1295     </STYLEPOINT>
   1296 
   1297     <STYLEPOINT title="Visibility (private and protected fields)">
   1298       <SUMMARY>Encouraged, use JSDoc annotations <code>@private</code> and
   1299         <code>@protected</code></SUMMARY>
   1300       <BODY>
   1301         <p>We recommend the use of the JSDoc annotations <code>@private</code> and
   1302           <code>@protected</code> to indicate visibility levels for classes,
   1303           functions, and properties.</p>
   1304         <p>The --jscomp_warning=visibility compiler flag turns on compiler
   1305           warnings for visibility violations. See
   1306           <a href="https://code.google.com/p/closure-compiler/wiki/Warnings">
   1307             Closure Compiler
   1308           Warnings</a>.
   1309         </p>
   1310         <p><code>@private</code> global variables and functions are only
   1311           accessible to code in the same file.</p>
   1312         <p>Constructors marked <code>@private</code> may only be instantiated by
   1313           code in the same file and by their static and instance members.
   1314           <code>@private</code> constructors may also be accessed anywhere in the
   1315           same file for their public static properties and by the
   1316           <code>instanceof</code> operator.</p>
   1317         <p>Global variables, functions, and constructors should never be
   1318           annotated <code>@protected</code>.</p>
   1319         <CODE_SNIPPET>
   1320           // File 1.
   1321           // AA_PrivateClass_ and AA_init_ are accessible because they are global
   1322           // and in the same file.
   1323 
   1324           /**
   1325            * @private
   1326            * @constructor
   1327            */
   1328           AA_PrivateClass_ = function() {
   1329           };
   1330 
   1331           /** @private */
   1332           function AA_init_() {
   1333             return new AA_PrivateClass_();
   1334           }
   1335 
   1336           AA_init_();
   1337         </CODE_SNIPPET>
   1338         <p><code>@private</code> properties are accessible to all code in the
   1339           same file, plus all static methods and instance methods of that class
   1340           that "owns" the property, if the property belongs to a class. They
   1341           cannot be accessed or overridden from a subclass in a different file.</p>
   1342         <p><code>@protected</code> properties are accessible to all code in the
   1343           same file, plus any static methods and instance methods of any subclass
   1344           of a class that "owns" the property.</p>
   1345         <p>Note that these semantics differ from those of C++ and Java, in that
   1346           they grant private and protected access to all code in the same file,
   1347           not just in the same class or class hierarchy. Also, unlike in C++,
   1348           private properties cannot be overridden by a subclass.
   1349         </p>
   1350         <CODE_SNIPPET>
   1351           // File 1.
   1352 
   1353           /** @constructor */
   1354           AA_PublicClass = function() {
   1355             /** @private */
   1356             this.privateProp_ = 2;
   1357 
   1358             /** @protected */
   1359             this.protectedProp = 4;
   1360           };
   1361 
   1362           /** @private */
   1363           AA_PublicClass.staticPrivateProp_ = 1;
   1364 
   1365           /** @protected */
   1366           AA_PublicClass.staticProtectedProp = 31;
   1367 
   1368           /** @private */
   1369           AA_PublicClass.prototype.privateMethod_ = function() {};
   1370 
   1371           /** @protected */
   1372           AA_PublicClass.prototype.protectedMethod = function() {};
   1373 
   1374           // File 2.
   1375 
   1376           /**
   1377            * @return {number} The number of ducks we've arranged in a row.
   1378            */
   1379           AA_PublicClass.prototype.method = function() {
   1380             // Legal accesses of these two properties.
   1381             return this.privateProp_ + AA_PublicClass.staticPrivateProp_;
   1382           };
   1383 
   1384           // File 3.
   1385 
   1386           /**
   1387            * @constructor
   1388            * @extends {AA_PublicClass}
   1389            */
   1390           AA_SubClass = function() {
   1391             // Legal access of a protected static property.
   1392             AA_PublicClass.staticProtectedProp = this.method();
   1393           };
   1394           goog.inherits(AA_SubClass, AA_PublicClass);
   1395 
   1396           /**
   1397            * @return {number} The number of ducks we've arranged in a row.
   1398            */
   1399           AA_SubClass.prototype.method = function() {
   1400             // Legal access of a protected instance property.
   1401             return this.protectedProp;
   1402           };
   1403         </CODE_SNIPPET>
   1404 
   1405         <p>Notice that in JavaScript, there is no distinction between a type
   1406         (like  <code>AA_PrivateClass_</code>) and the constructor for that
   1407         type. There is no way to express both that a type is public and its
   1408         constructor is private (because the constructor could easily be aliased
   1409         in a way that would defeat the privacy check).</p>
   1410       </BODY>
   1411     </STYLEPOINT>
   1412 
   1413     <STYLEPOINT title="JavaScript Types">
   1414       <SUMMARY>Encouraged and enforced by the compiler.</SUMMARY>
   1415       <BODY>
   1416         <a name="JsTypes"/>
   1417         <p>When documenting a type in JSDoc, be as specific and accurate as
   1418           possible. The types we support are based on the
   1419           <a href="http://wiki.ecmascript.org/doku.php?id=spec:spec">
   1420             EcmaScript 4 spec</a>.</p>
   1421         <SUBSECTION title="The JavaScript Type Language">
   1422           <p>The ES4 proposal contained a language for specifying JavaScript
   1423             types. We use this language in JsDoc to express the types of
   1424             function parameters and return values.</p>
   1425 
   1426           <p>As the ES4 proposal has evolved, this language has changed. The
   1427             compiler still supports old syntaxes for types, but those syntaxes
   1428             are deprecated.</p>
   1429 
   1430           <p/>
   1431           <table border="1" style="border-collapse:collapse" cellpadding="4">
   1432             <thead>
   1433               <tr>
   1434                 <th>Syntax Name</th>
   1435                 <th>Syntax</th>
   1436                 <th>Description</th>
   1437                 <th>Deprecated Syntaxes</th>
   1438               </tr>
   1439             </thead>
   1440             <tbody>
   1441               <tr>
   1442                 <td>Primitive Type</td>
   1443                 <td>
   1444                   There are 5 primitive types in JavaScript:
   1445                   <code>{null}</code>,
   1446                   <code>{undefined}</code>,
   1447                   <code>{boolean}</code>,
   1448                   <code>{number}</code>, and
   1449                   <code>{string}</code>.
   1450                 </td>
   1451                 <td>Simply the name of a type.</td>
   1452                 <td/>
   1453               </tr>
   1454 
   1455               <tr>
   1456                 <td>Instance Type</td>
   1457                 <td>
   1458                   <code>{Object}</code><br/>
   1459                   An instance of Object or null.<p/>
   1460                   <code>{Function}</code><br/>
   1461                   An instance of Function or null.<p/>
   1462                   <code>{EventTarget}</code><br/>
   1463                   An instance of a constructor that implements the EventTarget
   1464                   interface, or null.
   1465                 </td>
   1466                 <td>An instance of a constructor or interface function.<p/>
   1467 
   1468                 Constructor functions are functions defined with the
   1469                 <code>@constructor</code> JSDoc tag.
   1470                 Interface functions are functions defined with the
   1471                 <code>@interface</code> JSDoc tag.<p/>
   1472 
   1473                 By default, instance types will accept null. This is the only
   1474 		type syntax that makes the type nullable. Other type syntaxes
   1475 		in this table will not accept null.
   1476                 </td>
   1477                 <td/>
   1478               </tr>
   1479 
   1480               <tr>
   1481                 <td>Enum Type</td>
   1482                 <td>
   1483                   <code>{goog.events.EventType}</code><br/>
   1484                   One of the properties of the object literal initializer
   1485                   of <code>goog.events.EventType</code>.
   1486                 </td>
   1487                 <td>An enum must be initialized as an object literal, or as
   1488                 an alias of another enum, annotated with the <code>@enum</code>
   1489                 JSDoc tag. The properties of this literal are the instances
   1490                 of the enum. The syntax of the enum is defined
   1491                 <a href="#enums">below</a>.<p/>
   1492 
   1493                 Note that this is one of the few things in our type system
   1494                 that were not in the ES4 spec.
   1495                 </td>
   1496                 <td/>
   1497               </tr>
   1498 
   1499               <tr>
   1500                 <td>Type Application</td>
   1501                 <td>
   1502                   <code>{Array.&lt;string&gt;}</code><br/>An array of strings.<p/>
   1503                   <code>{Object.&lt;string, number&gt;}</code>
   1504                   <br/>An object in which the keys are strings and the values
   1505                   are numbers.
   1506                 </td>
   1507                 <td>Parameterizes a type, by applying a set of type arguments
   1508                   to that type. The idea is analogous to generics in Java.
   1509                 </td>
   1510                 <td/>
   1511               </tr>
   1512 
   1513               <tr>
   1514                 <td>Type Union</td>
   1515                 <td>
   1516                   <code>{(number|boolean)}</code><br/>A number or a boolean.
   1517                 </td>
   1518                 <td>Indicates that a value might have type A OR type B.<p/>
   1519 
   1520                   The parentheses may be omitted at the top-level
   1521                   expression, but the parentheses should be included in
   1522                   sub-expressions to avoid ambiguity.<br/>
   1523                   <code>{number|boolean}</code><br/>
   1524                   <code>{function(): (number|boolean)}</code>
   1525                 </td>
   1526                 <td>
   1527                   <code>{(number,boolean)}</code>,<br/>
   1528                   <code>{(number||boolean)}</code>
   1529                 </td>
   1530               </tr>
   1531 
   1532               <tr>
   1533                 <td>Nullable type</td>
   1534                 <td>
   1535                   <code>{?number}</code><br/> A number or null.
   1536                 </td>
   1537                 <td>Shorthand for the union of the null type with any
   1538                 other type. This is just syntactic sugar.
   1539                 </td>
   1540                 <td>
   1541                   <code>{number?}</code>
   1542                 </td>
   1543               </tr>
   1544 
   1545               <tr>
   1546                 <td>Non-nullable type</td>
   1547                 <td>
   1548                   <code>{!Object}</code><br/> An Object, but never the
   1549                   <code>null</code> value.
   1550                 </td>
   1551                 <td>Filters null out of nullable types. Most often used
   1552                 with instance types, which are nullable by default.
   1553                 </td>
   1554                 <td>
   1555                   <code>{Object!}</code>
   1556                 </td>
   1557               </tr>
   1558 
   1559               <tr>
   1560                 <td>Record Type</td>
   1561                 <td>
   1562                   <code>{{myNum: number, myObject}}</code>
   1563                   <br/>An anonymous type with the given type members.
   1564                 </td>
   1565                 <td>
   1566                   <p>Indicates that the value has the specified members with the
   1567                     specified types. In this case, <code>myNum</code> with a
   1568                     type <code>number</code> and <code>myObject</code> with any
   1569                     type.</p>
   1570                   <p>Notice that the braces are part of the type syntax. For
   1571                     example, to denote an <code>Array</code> of objects that
   1572                     have a <code>length</code> property, you might write
   1573                   <code>Array.&lt;{length}&gt;</code>.</p>
   1574                 </td>
   1575                 <td/>
   1576               </tr>
   1577 
   1578               <tr>
   1579                 <td>Function Type</td>
   1580                 <td>
   1581                   <code>{function(string, boolean)}</code><br/>
   1582                   A function that takes two arguments (a string and a boolean),
   1583                   and has an unknown return value.<br/>
   1584                 </td>
   1585                 <td>Specifies a function.</td>
   1586                 <td/>
   1587               </tr>
   1588 
   1589               <tr>
   1590                 <td>Function Return Type</td>
   1591                 <td>
   1592                   <code>{function(): number}</code><br/>
   1593                   A function that takes no arguments and returns a number.<br/>
   1594                 </td>
   1595                 <td>Specifies a function return type.</td>
   1596                 <td/>
   1597               </tr>
   1598 
   1599               <tr>
   1600                 <td>Function <code>this</code> Type</td>
   1601                 <td>
   1602                   <code>{function(this:goog.ui.Menu, string)}</code><br/>
   1603                   A function that takes one argument (a string), and executes
   1604                   in the context of a goog.ui.Menu.
   1605                 </td>
   1606                 <td>Specifies the context type of a function type.</td>
   1607                 <td/>
   1608               </tr>
   1609 
   1610               <tr>
   1611                 <td>Function <code>new</code> Type</td>
   1612                 <td>
   1613                   <code>{function(new:goog.ui.Menu, string)}</code><br/>
   1614                   A constructor that takes one argument (a string), and
   1615                   creates a new instance of goog.ui.Menu when called
   1616                   with the 'new' keyword.
   1617                 </td>
   1618                 <td>Specifies the constructed type of a constructor.</td>
   1619                 <td/>
   1620               </tr>
   1621 
   1622               <tr>
   1623                 <td>Variable arguments</td>
   1624                 <td>
   1625                   <code>{function(string, ...[number]): number}</code><br/>
   1626                   A function that takes one argument (a string), and then a
   1627                   variable number of arguments that must be numbers.
   1628                 </td>
   1629                 <td>Specifies variable arguments to a function.</td>
   1630                 <td/>
   1631               </tr>
   1632 
   1633               <tr>
   1634                 <td>
   1635                   <a name="var-args-annotation"/>
   1636                   Variable arguments (in <code>@param</code> annotations)
   1637                 </td>
   1638                 <td>
   1639                   <code>@param {...number} var_args</code><br/>
   1640                   A variable number of arguments to an annotated function.
   1641                 </td>
   1642                 <td>
   1643                   Specifies that the annotated function accepts a variable
   1644                   number of arguments.
   1645                 </td>
   1646                 <td/>
   1647               </tr>
   1648 
   1649               <tr>
   1650                 <td>Function <a href="#optional">optional arguments</a></td>
   1651                 <td>
   1652                   <code>{function(?string=, number=)}</code><br/>
   1653                   A function that takes one optional, nullable string and one
   1654                   optional number as arguments. The <code>=</code> syntax is
   1655                   only for <code>function</code> type declarations.
   1656                 </td>
   1657                 <td>Specifies optional arguments to a function.</td>
   1658                 <td/>
   1659               </tr>
   1660 
   1661               <tr>
   1662                 <td>
   1663                   <a name="optional-arg-annotation"/>
   1664                   Function <a href="#optional">optional arguments</a>
   1665                   (in <code>@param</code> annotations)
   1666                 </td>
   1667                 <td>
   1668                   <code>@param {number=} opt_argument</code><br/>
   1669                   An optional parameter of type <code>number</code>.
   1670                 </td>
   1671                 <td>Specifies that the annotated function accepts an optional
   1672                   argument.</td>
   1673                 <td/>
   1674               </tr>
   1675 
   1676               <tr>
   1677                 <td>The ALL type</td>
   1678                 <td><code>{*}</code></td>
   1679                 <td>Indicates that the variable can take on any type.</td>
   1680                 <td/>
   1681               </tr>
   1682 
   1683               <tr>
   1684                 <td>The UNKNOWN type</td>
   1685                 <td><code>{?}</code></td>
   1686                 <td>Indicates that the variable can take on any type,
   1687                     and the compiler should not type-check any uses of it.</td>
   1688                 <td/>
   1689               </tr>
   1690             </tbody>
   1691           </table>
   1692         </SUBSECTION>
   1693         <SUBSECTION title="Types in JavaScript">
   1694           <p/>
   1695           <table border="1" style="border-collapse:collapse" cellpadding="4">
   1696             <thead>
   1697               <tr>
   1698                 <th>Type Example</th>
   1699                 <th>Value Examples</th>
   1700                 <th>Description</th>
   1701               </tr>
   1702             </thead>
   1703             <tbody>
   1704 
   1705               <tr>
   1706                 <td>number</td>
   1707                 <td>
   1708                   <CODE_SNIPPET>
   1709                     1
   1710                     1.0
   1711                     -5
   1712                     1e5
   1713                     Math.PI
   1714                   </CODE_SNIPPET>
   1715                 </td>
   1716                 <td/>
   1717               </tr>
   1718 
   1719               <tr>
   1720                 <td>Number</td>
   1721                 <td>
   1722                   <CODE_SNIPPET>
   1723                     new Number(true)
   1724                   </CODE_SNIPPET>
   1725                 </td>
   1726                 <td>
   1727                   <a href="#Wrapper_objects_for_primitive_types">
   1728                     Number object
   1729                   </a>
   1730                 </td>
   1731               </tr>
   1732 
   1733               <tr>
   1734                 <td>string</td>
   1735                 <td>
   1736                   <CODE_SNIPPET>
   1737                     'Hello'
   1738                     "World"
   1739                     String(42)
   1740                   </CODE_SNIPPET>
   1741                 </td>
   1742                 <td>
   1743                   String value
   1744                 </td>
   1745               </tr>
   1746 
   1747               <tr>
   1748                 <td>String</td>
   1749                 <td>
   1750                   <CODE_SNIPPET>
   1751                     new String('Hello')
   1752                     new String(42)
   1753                   </CODE_SNIPPET>
   1754                 </td>
   1755                 <td>
   1756                   <a href="#Wrapper_objects_for_primitive_types">
   1757                     String object
   1758                   </a>
   1759                 </td>
   1760               </tr>
   1761 
   1762               <tr>
   1763                 <td>boolean</td>
   1764                 <td>
   1765                   <CODE_SNIPPET>
   1766                     true
   1767                     false
   1768                     Boolean(0)
   1769                   </CODE_SNIPPET>
   1770                 </td>
   1771                 <td>
   1772                   Boolean value
   1773                 </td>
   1774               </tr>
   1775 
   1776               <tr>
   1777                 <td>Boolean</td>
   1778                 <td>
   1779                   <CODE_SNIPPET>
   1780                     new Boolean(true)
   1781                   </CODE_SNIPPET>
   1782                 </td>
   1783                 <td>
   1784                   <a href="#Wrapper_objects_for_primitive_types">
   1785                     Boolean object
   1786                   </a>
   1787                 </td>
   1788               </tr>
   1789 
   1790               <tr>
   1791                 <td>RegExp</td>
   1792                 <td>
   1793                   <CODE_SNIPPET>
   1794                     new RegExp('hello')
   1795                     /world/g
   1796                   </CODE_SNIPPET></td><td>
   1797                 </td>
   1798               </tr>
   1799 
   1800               <tr>
   1801                 <td>Date</td>
   1802                 <td>
   1803                   <CODE_SNIPPET>
   1804                     new Date
   1805                     new Date()
   1806                   </CODE_SNIPPET></td>
   1807                 <td/>
   1808               </tr>
   1809 
   1810               <tr>
   1811                 <td>
   1812 
   1813                   null
   1814 
   1815                 </td>
   1816                 <td>
   1817                   <CODE_SNIPPET>
   1818                     null
   1819                   </CODE_SNIPPET>
   1820                 </td>
   1821                 <td/>
   1822               </tr>
   1823 
   1824               <tr>
   1825                 <td>
   1826 
   1827                   undefined
   1828 
   1829                 </td>
   1830                 <td>
   1831                   <CODE_SNIPPET>
   1832                     undefined
   1833                   </CODE_SNIPPET>
   1834                 </td>
   1835                 <td/>
   1836               </tr>
   1837 
   1838               <tr>
   1839                 <td>void</td>
   1840                 <td>
   1841                   <CODE_SNIPPET>
   1842                     function f() {
   1843                       return;
   1844                     }
   1845                   </CODE_SNIPPET>
   1846                 </td>
   1847                 <td>No return value</td>
   1848               </tr>
   1849 
   1850               <tr>
   1851                 <td>Array</td>
   1852                 <td>
   1853                   <CODE_SNIPPET>
   1854                     ['foo', 0.3, null]
   1855                     []
   1856                   </CODE_SNIPPET>
   1857                 </td>
   1858                 <td>Untyped Array</td>
   1859               </tr>
   1860 
   1861               <tr>
   1862                 <td>Array.&lt;number&gt;</td>
   1863                 <td>
   1864                   <CODE_SNIPPET>
   1865                     [11, 22, 33]
   1866                   </CODE_SNIPPET>
   1867                 </td>
   1868                 <td>
   1869                   An Array of numbers
   1870                 </td>
   1871               </tr>
   1872 
   1873               <tr>
   1874                 <td>Array.&lt;Array.&lt;string&gt;&gt;</td>
   1875                 <td>
   1876                   <CODE_SNIPPET>
   1877                     [['one', 'two', 'three'], ['foo', 'bar']]
   1878                   </CODE_SNIPPET>
   1879                 </td>
   1880                 <td>Array of Arrays of strings</td>
   1881               </tr>
   1882 
   1883               <tr>
   1884                 <td>Object</td>
   1885                 <td>
   1886                   <CODE_SNIPPET>
   1887                     {}
   1888                     {foo: 'abc', bar: 123, baz: null}
   1889                   </CODE_SNIPPET>
   1890                 </td>
   1891                 <td/>
   1892               </tr>
   1893 
   1894               <tr>
   1895                 <td>Object.&lt;string&gt;</td>
   1896                 <td>
   1897                   <CODE_SNIPPET>
   1898                     {'foo': 'bar'}
   1899                   </CODE_SNIPPET>
   1900                 </td>
   1901                 <td>
   1902                   An Object in which the values are strings.
   1903                 </td>
   1904               </tr>
   1905 
   1906               <tr>
   1907                 <td>Object.&lt;number, string&gt;</td>
   1908                 <td>
   1909                   <CODE_SNIPPET>
   1910                     var obj = {};
   1911                     obj[1] = 'bar';
   1912                   </CODE_SNIPPET>
   1913                 </td>
   1914                 <td>
   1915                   An Object in which the keys are numbers and the values are
   1916                   strings.  <p/>Note that in JavaScript, the keys are always
   1917                   implicitly converted to strings, so
   1918                   <code>obj['1'] == obj[1]</code>.
   1919                   So the key will always be a string in for...in loops. But the
   1920                   compiler will verify the type of the key when indexing into
   1921                   the object.
   1922                 </td>
   1923               </tr>
   1924 
   1925               <tr>
   1926                 <td>Function</td>
   1927                 <td>
   1928                   <CODE_SNIPPET>
   1929                     function(x, y) {
   1930                       return x * y;
   1931                     }
   1932                   </CODE_SNIPPET>
   1933                 </td>
   1934                 <td>
   1935                   <a href="#Wrapper_objects_for_primitive_types">
   1936                     Function object
   1937                   </a>
   1938                 </td>
   1939               </tr>
   1940 
   1941               <tr>
   1942                 <td>function(number, number): number</td>
   1943                 <td>
   1944                   <CODE_SNIPPET>
   1945                     function(x, y) {
   1946                       return x * y;
   1947                     }
   1948                   </CODE_SNIPPET>
   1949                 </td>
   1950                 <td>function value</td>
   1951               </tr>
   1952 
   1953               <tr>
   1954                 <td><a name="constructor-tag">SomeClass</a></td>
   1955                 <td>
   1956                   <CODE_SNIPPET>
   1957                     /** @constructor */
   1958                     function SomeClass() {}
   1959 
   1960                     new SomeClass();
   1961                   </CODE_SNIPPET>
   1962                 </td>
   1963                 <td/>
   1964               </tr>
   1965 
   1966               <tr>
   1967                 <td>SomeInterface</td>
   1968                 <td>
   1969                   <CODE_SNIPPET>
   1970                     /** @interface */
   1971                     function SomeInterface() {}
   1972 
   1973                     SomeInterface.prototype.draw = function() {};
   1974                   </CODE_SNIPPET>
   1975                 </td>
   1976                 <td/>
   1977               </tr>
   1978 
   1979               <tr>
   1980                 <td>project.MyClass</td>
   1981                 <td>
   1982                   <CODE_SNIPPET>
   1983                     /** @constructor */
   1984                     project.MyClass = function () {}
   1985 
   1986                     new project.MyClass()
   1987                   </CODE_SNIPPET>
   1988                 </td>
   1989                 <td/>
   1990               </tr>
   1991 
   1992               <tr>
   1993                 <td>project.MyEnum</td>
   1994                 <td>
   1995                   <CODE_SNIPPET>
   1996                     /** @enum {string} */
   1997                     project.MyEnum = {
   1998                       /** The color blue. */
   1999                       BLUE: '#0000dd',
   2000                       /** The color red. */
   2001                       RED: '#dd0000'
   2002                     };
   2003                   </CODE_SNIPPET>
   2004                 </td>
   2005                 <td><a name="enums">Enumeration</a><p/>
   2006                   JSDoc comments on enum values are optional.
   2007                 </td>
   2008               </tr>
   2009 
   2010               <tr>
   2011                 <td>Element</td>
   2012                 <td>
   2013                   <CODE_SNIPPET>
   2014                     document.createElement('div')
   2015                   </CODE_SNIPPET>
   2016                 </td>
   2017                 <td>Elements in the DOM.</td>
   2018               </tr>
   2019 
   2020               <tr>
   2021                 <td>Node</td>
   2022                 <td>
   2023                   <CODE_SNIPPET>
   2024                     document.body.firstChild
   2025                   </CODE_SNIPPET>
   2026                 </td>
   2027                 <td>Nodes in the DOM.</td>
   2028               </tr>
   2029 
   2030               <tr>
   2031                 <td>HTMLInputElement</td>
   2032                 <td>
   2033                   <CODE_SNIPPET>
   2034                     htmlDocument.getElementsByTagName('input')[0]
   2035                   </CODE_SNIPPET>
   2036                 </td>
   2037                 <td>A specific type of DOM element.</td>
   2038               </tr>
   2039             </tbody>
   2040           </table>
   2041         </SUBSECTION>
   2042 
   2043         <SUBSECTION title="Type Casts">
   2044           <p>In cases where type-checking doesn't accurately infer the type of
   2045             an expression, it is possible to add a type cast comment by adding a
   2046             type annotation comment and enclosing the expression in
   2047             parentheses. The parentheses are required.</p>
   2048 
   2049           <CODE_SNIPPET>
   2050             /** @type {number} */ (x)
   2051           </CODE_SNIPPET>
   2052         </SUBSECTION>
   2053 
   2054         <SUBSECTION title="Nullable vs. Optional Parameters and Properties">
   2055           <a name="optional"/>
   2056           <p>Because JavaScript is a loosely-typed language, it is very
   2057             important to understand the subtle differences between optional,
   2058             nullable, and undefined function parameters and class
   2059             properties.</p>
   2060 
   2061           <p>Instances of classes and interfaces are nullable by default.
   2062           For example, the following declaration</p>
   2063 
   2064           <CODE_SNIPPET>
   2065             /**
   2066              * Some class, initialized with a value.
   2067              * @param {Object} value Some value.
   2068              * @constructor
   2069              */
   2070             function MyClass(value) {
   2071               /**
   2072                * Some value.
   2073                * @type {Object}
   2074                * @private
   2075                */
   2076               this.myValue_ = value;
   2077             }
   2078           </CODE_SNIPPET>
   2079 
   2080           <p>tells the compiler that the <code>myValue_</code> property holds
   2081             either an Object or null.  If <code>myValue_</code> must never be
   2082             null, it should be declared like this:</p>
   2083 
   2084           <CODE_SNIPPET>
   2085             /**
   2086              * Some class, initialized with a non-null value.
   2087              * @param {!Object} value Some value.
   2088              * @constructor
   2089              */
   2090             function MyClass(value) {
   2091               /**
   2092                * Some value.
   2093                * @type {!Object}
   2094                * @private
   2095                */
   2096               this.myValue_ = value;
   2097             }
   2098           </CODE_SNIPPET>
   2099 
   2100           <p>This way, if the compiler can determine that somewhere in the code
   2101             <code>MyClass</code> is initialized with a null value, it will issue
   2102             a warning.</p>
   2103 
   2104 
   2105 
   2106           <p>Optional parameters to functions may be undefined at runtime, so if
   2107           they are assigned to class properties, those properties must be
   2108           declared accordingly:</p>
   2109 
   2110           <CODE_SNIPPET>
   2111             /**
   2112              * Some class, initialized with an optional value.
   2113              * @param {Object=} opt_value Some value (optional).
   2114              * @constructor
   2115              */
   2116             function MyClass(opt_value) {
   2117               /**
   2118                * Some value.
   2119                * @type {Object|undefined}
   2120                * @private
   2121                */
   2122               this.myValue_ = opt_value;
   2123             }
   2124           </CODE_SNIPPET>
   2125 
   2126           <p>This tells the compiler that <code>myValue_</code> may hold an
   2127             Object, null, or remain undefined.</p>
   2128 
   2129           <p>Note that the optional parameter <code>opt_value</code> is declared
   2130             to be of type <code>{Object=}</code>, not
   2131             <code>{Object|undefined}</code>.  This is because optional
   2132             parameters may, by definition, be undefined.  While there is no harm
   2133             in explicitly declaring an optional parameter as possibly undefined,
   2134             it is both unnecessary and makes the code harder to read.</p>
   2135 
   2136           <p>Finally, note that being nullable and being optional are orthogonal
   2137             properties.  The following four declarations are all different:</p>
   2138 
   2139           <CODE_SNIPPET>
   2140             /**
   2141              * Takes four arguments, two of which are nullable, and two of which are
   2142              * optional.
   2143              * @param {!Object} nonNull Mandatory (must not be undefined), must not be null.
   2144              * @param {Object} mayBeNull Mandatory (must not be undefined), may be null.
   2145              * @param {!Object=} opt_nonNull Optional (may be undefined), but if present,
   2146              *     must not be null!
   2147              * @param {Object=} opt_mayBeNull Optional (may be undefined), may be null.
   2148              */
   2149             function strangeButTrue(nonNull, mayBeNull, opt_nonNull, opt_mayBeNull) {
   2150               // ...
   2151             };
   2152           </CODE_SNIPPET>
   2153         </SUBSECTION>
   2154 
   2155         <SUBSECTION title="Typedefs">
   2156           <a name="Typedefs"/>
   2157           <p>Sometimes types can get complicated. A function that accepts
   2158             content for an Element might look like:</p>
   2159 
   2160           <CODE_SNIPPET>
   2161             /**
   2162              * @param {string} tagName
   2163              * @param {(string|Element|Text|Array.&lt;Element&gt;|Array.&lt;Text&gt;)} contents
   2164              * @return {!Element}
   2165              */
   2166             goog.createElement = function(tagName, contents) {
   2167               ...
   2168             };
   2169           </CODE_SNIPPET>
   2170 
   2171           <p>You can define commonly used type expressions with a
   2172             <code>@typedef</code> tag. For example,</p>
   2173 
   2174           <CODE_SNIPPET>
   2175             /** @typedef {(string|Element|Text|Array.&lt;Element&gt;|Array.&lt;Text&gt;)} */
   2176             goog.ElementContent;
   2177 
   2178             /**
   2179              * @param {string} tagName
   2180              * @param {goog.ElementContent} contents
   2181              * @return {!Element}
   2182              */
   2183             goog.createElement = function(tagName, contents) {
   2184             ...
   2185             };
   2186           </CODE_SNIPPET>
   2187         </SUBSECTION>
   2188 
   2189         <SUBSECTION title="Template types">
   2190           <a name="Template_types"/>
   2191           <p>The compiler has limited support for template types. It can only
   2192             infer the type of <code>this</code> inside an anonymous function
   2193             literal from the type of the <code>this</code> argument and whether the
   2194             <code>this</code> argument is missing.</p>
   2195 
   2196           <CODE_SNIPPET>
   2197             /**
   2198              * @param {function(this:T, ...)} fn
   2199              * @param {T} thisObj
   2200              * @param {...*} var_args
   2201              * @template T
   2202              */
   2203             goog.bind = function(fn, thisObj, var_args) {
   2204             ...
   2205             };
   2206             // Possibly generates a missing property warning.
   2207             goog.bind(function() { this.someProperty; }, new SomeClass());
   2208             // Generates an undefined this warning.
   2209             goog.bind(function() { this.someProperty; });
   2210           </CODE_SNIPPET>
   2211         </SUBSECTION>
   2212       </BODY>
   2213     </STYLEPOINT>
   2214 
   2215     <STYLEPOINT title="Comments">
   2216       <SUMMARY>Use JSDoc</SUMMARY>
   2217       <BODY>
   2218         <p>
   2219           We follow the
   2220           <a href="cppguide.html#Comments">
   2221             C++ style for comments</a> in spirit.
   2222         </p>
   2223 
   2224         <p>All files, classes, methods and properties should be documented with
   2225           <a href="https://code.google.com/p/jsdoc-toolkit/">JSDoc</a>
   2226           comments with the appropriate <a href="#JSDoc_Tag_Reference">tags</a>
   2227           and <a href="#JsTypes">types</a>. Textual descriptions for properties,
   2228           methods, method parameters and method return values should be included
   2229           unless obvious from the property, method, or parameter name.
   2230         </p>
   2231 
   2232         <p>Inline comments should be of the <code>//</code> variety.</p>
   2233 
   2234         <p>Complete sentences are recommended but not required.
   2235         Complete sentences should use appropriate capitalization
   2236         and punctuation.</p>
   2237 
   2238         <SUBSECTION title="Comment Syntax">
   2239           <p>The JSDoc syntax is based on
   2240           <a href="https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html">
   2241           JavaDoc</a>. Many tools extract metadata from JSDoc comments to
   2242           perform code validation and optimizations. These comments must be
   2243           well-formed.</p>
   2244 
   2245           <CODE_SNIPPET>
   2246           /**
   2247            * A JSDoc comment should begin with a slash and 2 asterisks.
   2248            * Inline tags should be enclosed in braces like {@code this}.
   2249            * @desc Block tags should always start on their own line.
   2250            */
   2251           </CODE_SNIPPET>
   2252         </SUBSECTION>
   2253 
   2254         <SUBSECTION title="JSDoc Indentation">
   2255           <p>If you have to line break a block tag, you should treat this as
   2256           breaking a code statement and indent it four spaces.</p>
   2257 
   2258           <CODE_SNIPPET>
   2259             /**
   2260              * Illustrates line wrapping for long param/return descriptions.
   2261              * @param {string} foo This is a param with a description too long to fit in
   2262              *     one line.
   2263              * @return {number} This returns something that has a description too long to
   2264              *     fit in one line.
   2265              */
   2266             project.MyClass.prototype.method = function(foo) {
   2267               return 5;
   2268             };
   2269           </CODE_SNIPPET>
   2270 
   2271           <p>You should not indent the <code>@fileoverview</code> command. You do not have to
   2272             indent the <code>@desc</code> command.</p>
   2273 
   2274           <p>Even though it is not preferred, it is also acceptable to line up
   2275              the description.</p>
   2276 
   2277           <CODE_SNIPPET>
   2278             /**
   2279              * This is NOT the preferred indentation method.
   2280              * @param {string} foo This is a param with a description too long to fit in
   2281              *                     one line.
   2282              * @return {number} This returns something that has a description too long to
   2283              *                  fit in one line.
   2284              */
   2285             project.MyClass.prototype.method = function(foo) {
   2286               return 5;
   2287             };
   2288           </CODE_SNIPPET>
   2289         </SUBSECTION>
   2290 
   2291         <SUBSECTION title="HTML in JSDoc">
   2292           <p>Like JavaDoc, JSDoc supports many HTML tags, like &lt;code&gt;,
   2293             &lt;pre&gt;, &lt;tt&gt;, &lt;strong&gt;, &lt;ul&gt;, &lt;ol&gt;,
   2294             &lt;li&gt;, &lt;a&gt;, and others.</p>
   2295 
   2296           <p>This means that plaintext formatting is not respected. So, don't
   2297             rely on whitespace to format JSDoc:</p>
   2298 
   2299           <BAD_CODE_SNIPPET>
   2300             /**
   2301              * Computes weight based on three factors:
   2302              *   items sent
   2303              *   items received
   2304              *   last timestamp
   2305              */
   2306           </BAD_CODE_SNIPPET>
   2307 
   2308           <p>It'll come out like this:</p>
   2309 
   2310           <BAD_CODE_SNIPPET>
   2311           Computes weight based on three factors: items sent items received last timestamp
   2312           </BAD_CODE_SNIPPET>
   2313 
   2314           <p>Instead, do this:</p>
   2315 
   2316           <CODE_SNIPPET>
   2317             /**
   2318              * Computes weight based on three factors:
   2319              * &lt;ul&gt;
   2320              * &lt;li&gt;items sent
   2321              * &lt;li&gt;items received
   2322              * &lt;li&gt;last timestamp
   2323              * &lt;/ul&gt;
   2324              */
   2325           </CODE_SNIPPET>
   2326 
   2327           The <a href="https://www.oracle.com/technetwork/java/javase/documentation/index-137868.html">
   2328           JavaDoc</a> style guide is a useful resource on how to write
   2329           well-formed doc comments.
   2330         </SUBSECTION>
   2331 
   2332         <SUBSECTION title="Top/File-Level Comments">
   2333           <p>
   2334 
   2335             A <a href="copyright.html">copyright notice</a> and author information are optional.
   2336             File overviews are generally recommended whenever a file consists of
   2337             more than a single class definition. The top level comment is
   2338             designed to orient readers unfamiliar with the code to what is in
   2339             this file.  If present, it should provide a description of the
   2340             file's contents and any dependencies or compatibility information.
   2341             As an example:
   2342           </p>
   2343 
   2344           <CODE_SNIPPET>
   2345             /**
   2346              * @fileoverview Description of file, its uses and information
   2347              * about its dependencies.
   2348              */
   2349           </CODE_SNIPPET>
   2350 
   2351 
   2352         </SUBSECTION>
   2353 
   2354         <SUBSECTION title="Class Comments">
   2355           <p>Classes must be documented with a description and a
   2356             <a href="#constructor-tag">type tag that
   2357               identifies the constructor</a>.
   2358           </p>
   2359 
   2360           <CODE_SNIPPET>
   2361             /**
   2362              * Class making something fun and easy.
   2363              * @param {string} arg1 An argument that makes this more interesting.
   2364              * @param {Array.&lt;number&gt;} arg2 List of numbers to be processed.
   2365              * @constructor
   2366              * @extends {goog.Disposable}
   2367              */
   2368             project.MyClass = function(arg1, arg2) {
   2369               // ...
   2370             };
   2371             goog.inherits(project.MyClass, goog.Disposable);
   2372           </CODE_SNIPPET>
   2373         </SUBSECTION>
   2374 
   2375         <SUBSECTION title="Method and Function Comments">
   2376           <p>Parameter and return types should be documented. The method
   2377              description may be omitted if it is obvious from the parameter
   2378              or return type descriptions. Method descriptions should start
   2379              with a sentence written in the third person declarative voice.</p>
   2380           <CODE_SNIPPET>
   2381             /**
   2382              * Operates on an instance of MyClass and returns something.
   2383              * @param {project.MyClass} obj Instance of MyClass which leads to a long
   2384              *     comment that needs to be wrapped to two lines.
   2385              * @return {boolean} Whether something occurred.
   2386              */
   2387             function PR_someMethod(obj) {
   2388               // ...
   2389             }
   2390           </CODE_SNIPPET>
   2391         </SUBSECTION>
   2392 
   2393         <SUBSECTION title="Property Comments">
   2394           <CODE_SNIPPET>
   2395             /** @constructor */
   2396             project.MyClass = function() {
   2397               /**
   2398                * Maximum number of things per pane.
   2399                * @type {number}
   2400                */
   2401               this.someProperty = 4;
   2402             }
   2403           </CODE_SNIPPET>
   2404         </SUBSECTION>
   2405 
   2406         <SUBSECTION title="JSDoc Tag Reference">
   2407           <a name="JSDoc_Tag_Reference"/>
   2408           <p/>
   2409           <table border="1" style="border-collapse:collapse" cellpadding="4">
   2410             <thead>
   2411               <tr>
   2412                 <th>Tag</th>
   2413                 <th>Template &amp; Examples</th>
   2414                 <th>Description</th>
   2415               </tr>
   2416             </thead>
   2417             <tbody>
   2418               <tr>
   2419                 <td>
   2420                   <a name="tag-author">@author</a>
   2421 
   2422                 </td>
   2423                 <td>
   2424                   <code>@author username (a] google.com (first last)</code>
   2425                   <p><i>For example:</i></p>
   2426                   <CODE_SNIPPET>
   2427                     /**
   2428                      * @fileoverview Utilities for handling textareas.
   2429                      * @author kuth (a] google.com (Uthur Pendragon)
   2430                      */
   2431                   </CODE_SNIPPET>
   2432                 </td>
   2433                 <td>
   2434                   Document the author of a file or the owner of a test,
   2435                   generally only used in the <code>@fileoverview</code> comment.
   2436 
   2437                 </td>
   2438               </tr>
   2439 
   2440 
   2441 
   2442               <tr>
   2443                 <td><a name="tag-code">@code</a></td>
   2444                 <td>
   2445                   <code>{@code ...}</code>
   2446                   <p><i>For example:</i></p>
   2447                   <CODE_SNIPPET>
   2448                     /**
   2449                      * Moves to the next position in the selection.
   2450                      * Throws {@code goog.iter.StopIteration} when it
   2451                      * passes the end of the range.
   2452                      * @return {Node} The node at the next position.
   2453                      */
   2454                     goog.dom.RangeIterator.prototype.next = function() {
   2455                       // ...
   2456                     };
   2457                   </CODE_SNIPPET>
   2458                 </td>
   2459                 <td>
   2460                   Indicates that a term in a JSDoc description is code so it may
   2461                   be correctly formatted in generated documentation.
   2462                 </td>
   2463               </tr>
   2464 
   2465               <tr>
   2466                 <td><a name="tag-const">@const</a></td>
   2467                 <td>
   2468                   <code>@const</code><br/>
   2469                   <code>@const {type}</code>
   2470                   <p><i>For example:</i></p>
   2471                   <CODE_SNIPPET>
   2472                     /** @const */ var MY_BEER = 'stout';
   2473 
   2474                     /**
   2475                      * My namespace's favorite kind of beer.
   2476                      * @const {string}
   2477                      */
   2478                     mynamespace.MY_BEER = 'stout';
   2479 
   2480                     /** @const */ MyClass.MY_BEER = 'stout';
   2481 
   2482                     /**
   2483                      * Initializes the request.
   2484                      * @const
   2485                      */
   2486                     mynamespace.Request.prototype.initialize = function() {
   2487                       // This method cannot be overridden in a subclass.
   2488                     };
   2489                   </CODE_SNIPPET>
   2490                 </td>
   2491                 <td>
   2492                   <p>Marks a variable (or property) as read-only and suitable
   2493                   for inlining.</p>
   2494 
   2495                   <p>A <code>@const</code> variable is an immutable pointer to
   2496                   a value.  If a variable or property marked as
   2497                   <code>@const</code> is overwritten, JSCompiler will give
   2498                   warnings.</p>
   2499 
   2500                   <p>The type declaration of a constant value can be omitted
   2501                     if it can be clearly inferred. An additional comment about
   2502                     the variable is optional.</p>
   2503 
   2504                   <p>When <code>@const</code> is applied to a method, it
   2505                     implies the method is not only not overwritable, but also
   2506                     that the method is <em>finalized</em> 
   2507                     not overridable in subclasses.</p>
   2508 
   2509                   <p>For more on <code>@const</code>, see the
   2510                     <a href="#Constants">Constants</a> section.</p>
   2511 
   2512                 </td>
   2513               </tr>
   2514 
   2515               <tr>
   2516                 <td><a name="tag-constructor">@constructor</a></td>
   2517                 <td>
   2518                   <code>@constructor</code>
   2519                   <p><i>For example:</i></p>
   2520                   <CODE_SNIPPET>
   2521                     /**
   2522                      * A rectangle.
   2523                      * @constructor
   2524                      */
   2525                     function GM_Rect() {
   2526                       ...
   2527                     }
   2528                   </CODE_SNIPPET>
   2529                 </td>
   2530                 <td>
   2531                   Used in a class's documentation to indicate the constructor.
   2532                 </td>
   2533               </tr>
   2534 
   2535               <tr>
   2536                 <td><a name="tag-define">@define</a></td>
   2537                 <td>
   2538                   <code>@define {Type} description</code>
   2539                   <p><i>For example:</i></p>
   2540                   <CODE_SNIPPET>
   2541                     /** @define {boolean} */
   2542                     var TR_FLAGS_ENABLE_DEBUG = true;
   2543 
   2544                     /**
   2545                      * @define {boolean} Whether we know at compile-time that
   2546                      *     the browser is IE.
   2547                      */
   2548                     goog.userAgent.ASSUME_IE = false;
   2549                   </CODE_SNIPPET>
   2550                 </td>
   2551                 <td>
   2552                   Indicates a constant that can be overridden by the compiler at
   2553                   compile-time. In the example, the compiler flag
   2554                   <code>--define='goog.userAgent.ASSUME_IE=true'</code>
   2555                   could be specified in the BUILD file to indicate that the
   2556                   constant <code>goog.userAgent.ASSUME_IE</code> should be replaced
   2557                   with <code>true</code>.
   2558                 </td>
   2559               </tr>
   2560 
   2561               <tr>
   2562                 <td><a name="tag-deprecated">@deprecated</a></td>
   2563                 <td>
   2564                   <code>@deprecated Description</code>
   2565                   <p><i>For example:</i></p>
   2566                   <CODE_SNIPPET>
   2567                     /**
   2568                      * Determines whether a node is a field.
   2569                      * @return {boolean} True if the contents of
   2570                      *     the element are editable, but the element
   2571                      *     itself is not.
   2572                      * @deprecated Use isField().
   2573                      */
   2574                     BN_EditUtil.isTopEditableField = function(node) {
   2575                       // ...
   2576                     };
   2577                   </CODE_SNIPPET>
   2578                 </td>
   2579                 <td>
   2580                   Used to tell that a function, method or property should not be
   2581                   used any more.  Always provide instructions on what callers
   2582                   should use instead.
   2583                 </td>
   2584               </tr>
   2585 
   2586               <tr>
   2587                 <td><a name="tag-dict">@dict</a></td>
   2588                 <td>
   2589                   <code>@dict Description</code>
   2590                   <p><i>For example:</i></p>
   2591                   <CODE_SNIPPET>
   2592                     /**
   2593                      * @constructor
   2594                      * @dict
   2595                      */
   2596                     function Foo(x) {
   2597                       this['x'] = x;
   2598                     }
   2599                     var obj = new Foo(123);
   2600                     var num = obj.x;  // warning
   2601 
   2602                     (/** @dict */ { x: 1 }).x = 123;  // warning
   2603                   </CODE_SNIPPET>
   2604                 </td>
   2605                 <td>
   2606                   When a constructor (<code>Foo</code> in the example) is
   2607                   annotated with <code>@dict</code>, you can only use the
   2608                   bracket notation to access the properties of <code>Foo</code>
   2609                   objects.
   2610                   The annotation can also be used directly on object literals.
   2611                 </td>
   2612               </tr>
   2613 
   2614               <tr>
   2615                 <td><a name="tag-enum">@enum</a></td>
   2616                 <td>
   2617                   <code>@enum {Type}</code>
   2618                   <p><i>For example:</i></p>
   2619                   <CODE_SNIPPET>
   2620                     /**
   2621                      * Enum for tri-state values.
   2622                      * @enum {number}
   2623                      */
   2624                     project.TriState = {
   2625                       TRUE: 1,
   2626                       FALSE: -1,
   2627                       MAYBE: 0
   2628                     };
   2629                   </CODE_SNIPPET>
   2630                 </td>
   2631               </tr>
   2632 
   2633               <tr>
   2634                 <td><a name="tag-export">@export</a></td>
   2635                 <td>
   2636                   <code>@export</code>
   2637                   <p><i>For example:</i></p>
   2638                   <CODE_SNIPPET>
   2639                     /** @export */
   2640                     foo.MyPublicClass.prototype.myPublicMethod = function() {
   2641                       // ...
   2642                     };
   2643                   </CODE_SNIPPET>
   2644                 </td>
   2645                 <td>
   2646                   <p>Given the code on the left, when the compiler is run with
   2647                   the <code>--generate_exports</code> flag, it will generate the
   2648                   code:</p>
   2649                   <CODE_SNIPPET>
   2650                     goog.exportSymbol('foo.MyPublicClass.prototype.myPublicMethod',
   2651                         foo.MyPublicClass.prototype.myPublicMethod);
   2652                   </CODE_SNIPPET>
   2653                   <p>which will export the symbols to uncompiled code.
   2654                   Code that uses the <code>@export</code> annotation must either</p>
   2655                   <ol>
   2656                     <li>include <code>//javascript/closure/base.js</code>, or</li>
   2657                     <li>define both <code>goog.exportSymbol</code> and
   2658                       <code>goog.exportProperty</code> with the same method
   2659                       signature in their own codebase.</li>
   2660                   </ol>
   2661                 </td>
   2662               </tr>
   2663 
   2664               <tr>
   2665                 <td><a name="tag-expose">@expose</a></td>
   2666                 <td>
   2667                   <code>@expose</code>
   2668                   <p><i>For example:</i></p>
   2669                   <CODE_SNIPPET>
   2670                     /** @expose */
   2671                     MyClass.prototype.exposedProperty = 3;
   2672                   </CODE_SNIPPET>
   2673                 </td>
   2674                 <td>
   2675                   <p>
   2676                     Declares an exposed property. Exposed properties
   2677                     will not be removed, or renamed, or collapsed,
   2678                     or optimized in any way by the compiler. No properties
   2679                     with the same name will be able to be optimized either.
   2680                   </p>
   2681 
   2682                   <p>
   2683                     <code>@expose</code> should never be used in library code,
   2684                     because it will prevent that property from ever getting
   2685                     removed.
   2686                   </p>
   2687                 </td>
   2688               </tr>
   2689 
   2690               <tr>
   2691                 <td><a name="tag-extends">@extends</a></td>
   2692                 <td>
   2693                   <code>
   2694                     @extends Type<br/>
   2695                     @extends {Type}
   2696                   </code>
   2697                   <p><i>For example:</i></p>
   2698                   <CODE_SNIPPET>
   2699                     /**
   2700                      * Immutable empty node list.
   2701                      * @constructor
   2702                      * @extends goog.ds.BasicNodeList
   2703                      */
   2704                     goog.ds.EmptyNodeList = function() {
   2705                       ...
   2706                     };
   2707                   </CODE_SNIPPET>
   2708                 </td>
   2709                 <td>
   2710                   Used with <code>@constructor</code> to indicate that a class
   2711                   inherits from another class. Curly braces around the type are
   2712                   optional.
   2713                 </td>
   2714               </tr>
   2715 
   2716               <tr>
   2717                 <td><a name="tag-externs">@externs</a></td>
   2718                 <td>
   2719                   <code>@externs</code>
   2720                   <p><i>For example:</i></p>
   2721                   <CODE_SNIPPET>
   2722                     /**
   2723                      * @fileoverview This is an externs file.
   2724                      * @externs
   2725                      */
   2726 
   2727                     var document;
   2728                   </CODE_SNIPPET>
   2729                 </td>
   2730                 <td>
   2731                   <p>
   2732                     Declares an
   2733 
   2734                     externs file.
   2735                   </p>
   2736 
   2737 
   2738                 </td>
   2739               </tr>
   2740 
   2741               <tr>
   2742                 <td><a name="tag-fileoverview">@fileoverview</a></td>
   2743                 <td>
   2744                   <code>@fileoverview Description</code>
   2745                   <p><i>For example:</i></p>
   2746                   <CODE_SNIPPET>
   2747                     /**
   2748                      * @fileoverview Utilities for doing things that require this very long
   2749                      * but not indented comment.
   2750                      * @author kuth (a] google.com (Uthur Pendragon)
   2751                      */
   2752                   </CODE_SNIPPET>
   2753                 </td>
   2754                 <td>Makes the comment block provide file level information.</td>
   2755               </tr>
   2756 
   2757               <tr>
   2758                 <td><a name="tag-implements">@implements</a></td>
   2759                 <td>
   2760                   <code>
   2761                     @implements Type<br/>
   2762                     @implements {Type}
   2763                   </code>
   2764                   <p><i>For example:</i></p>
   2765                   <CODE_SNIPPET>
   2766                     /**
   2767                      * A shape.
   2768                      * @interface
   2769                      */
   2770                     function Shape() {};
   2771                     Shape.prototype.draw = function() {};
   2772 
   2773                     /**
   2774                      * @constructor
   2775                      * @implements {Shape}
   2776                      */
   2777                     function Square() {};
   2778                     Square.prototype.draw = function() {
   2779                       ...
   2780                     };
   2781                   </CODE_SNIPPET>
   2782                 </td>
   2783                 <td>
   2784                   Used with <code>@constructor</code> to indicate that a class
   2785                   implements an interface. Curly braces around the type are
   2786                   optional.
   2787                 </td>
   2788               </tr>
   2789 
   2790               <tr>
   2791                 <td><a name="tag-inheritDoc">@inheritDoc</a></td>
   2792                 <td>
   2793                   <code>@inheritDoc</code>
   2794                   <p><i>For example:</i></p>
   2795                   <CODE_SNIPPET>
   2796                     /** @inheritDoc */
   2797                     project.SubClass.prototype.toString() {
   2798                       // ...
   2799                     };
   2800                   </CODE_SNIPPET>
   2801                 </td>
   2802                 <td>
   2803                   <p style="font-weight:bold">Deprecated. Use
   2804                     <code>@override</code> instead.</p>
   2805 
   2806                   Indicates that a method or property of a subclass
   2807                   intentionally hides a method or property of the superclass,
   2808                   and has exactly the same documentation. Notice that
   2809                   <code>@inheritDoc</code> implies <code>@override</code>
   2810                 </td>
   2811               </tr>
   2812 
   2813               <tr>
   2814                 <td><a name="tag-interface">@interface</a></td>
   2815                 <td>
   2816                   <code>@interface</code>
   2817                   <p><i>For example:</i></p>
   2818                   <CODE_SNIPPET>
   2819                     /**
   2820                      * A shape.
   2821                      * @interface
   2822                      */
   2823                     function Shape() {};
   2824                     Shape.prototype.draw = function() {};
   2825 
   2826                     /**
   2827                      * A polygon.
   2828                      * @interface
   2829                      * @extends {Shape}
   2830                      */
   2831                     function Polygon() {};
   2832                     Polygon.prototype.getSides = function() {};
   2833                   </CODE_SNIPPET>
   2834                 </td>
   2835                 <td>
   2836                   Used to indicate that the function defines an interface.
   2837                 </td>
   2838               </tr>
   2839 
   2840               <tr>
   2841                 <td><a name="tag-lends">@lends</a></td>
   2842                 <td>
   2843                   <code>@lends objectName</code><br/>
   2844                   <code>@lends {objectName}</code>
   2845                   <p><i>For example:</i></p>
   2846                   <CODE_SNIPPET>
   2847                     goog.object.extend(
   2848                         Button.prototype,
   2849                         /** @lends {Button.prototype} */ {
   2850                           isButton: function() { return true; }
   2851                         });
   2852                   </CODE_SNIPPET>
   2853                 </td>
   2854                 <td>
   2855                   Indicates that the keys of an object literal should
   2856                   be treated as properties of some other object. This annotation
   2857                   should only appear on object literals.<p/>
   2858 
   2859                   Notice that the name in braces is not a type name like
   2860                   in other annotations. It's an object name. It names
   2861                   the object on which the properties are "lent".
   2862                   For example, <code>@type {Foo}</code> means "an instance of Foo",
   2863                   but <code>@lends {Foo}</code> means "the constructor Foo".<p/>
   2864 
   2865                   The <a href="https://code.google.com/p/jsdoc-toolkit/wiki/TagLends">
   2866                   JSDoc Toolkit docs</a> have more information on this
   2867                   annotation.
   2868                 </td>
   2869               </tr>
   2870 
   2871               <tr>
   2872                 <td><a name="tag-license">@license</a> or
   2873                   <a name="tag-preserve">@preserve</a></td>
   2874                 <td>
   2875                   <code>@license Description</code>
   2876                   <p><i>For example:</i></p>
   2877                   <CODE_SNIPPET>
   2878                     /**
   2879                      * @preserve Copyright 2009 SomeThirdParty.
   2880                      * Here is the full license text and copyright
   2881                      * notice for this file. Note that the notice can span several
   2882                      * lines and is only terminated by the closing star and slash:
   2883                      */
   2884                   </CODE_SNIPPET>
   2885                 </td>
   2886                 <td>
   2887                   Anything marked by <code>@license</code> or
   2888                   <code>@preserve</code> will be retained by the compiler and
   2889                   output at the top of the compiled code for that file. This
   2890                   annotation allows important notices (such as legal licenses or
   2891                   copyright text) to survive compilation unchanged. Line breaks
   2892                   are preserved.
   2893                 </td>
   2894               </tr>
   2895 
   2896 
   2897 
   2898 
   2899 
   2900               <tr>
   2901                 <td><a name="tag-noalias">@noalias</a></td>
   2902                 <td>
   2903                   <code>@noalias</code>
   2904                   <p><i>For example:</i></p>
   2905                   <CODE_SNIPPET>
   2906                     /** @noalias */
   2907                     function Range() {}
   2908                   </CODE_SNIPPET>
   2909                 </td>
   2910                 <td>
   2911                   Used in an externs file to indicate to the compiler that the
   2912                   variable or function should not be aliased as part of the
   2913                   alias externals pass of the compiler.
   2914                 </td>
   2915               </tr>
   2916 
   2917               <tr>
   2918                 <td><a name="tag-nocompile">@nocompile</a></td>
   2919                 <td>
   2920                   <code>@nocompile</code>
   2921                   <p><i>For example:</i></p>
   2922                   <CODE_SNIPPET>
   2923                     /** @nocompile */
   2924 
   2925                     // JavaScript code
   2926                   </CODE_SNIPPET>
   2927                 </td>
   2928                 <td>
   2929                   Used at the top of a file to tell the compiler to parse this
   2930                   file but not compile it.
   2931                   Code that is not meant for compilation and should be omitted
   2932                   from compilation tests (such as bootstrap code) uses this
   2933                   annotation.
   2934                   Use sparingly.
   2935                 </td>
   2936               </tr>
   2937 
   2938               <tr>
   2939                 <td><a name="tag-nosideeffects">@nosideeffects</a></td>
   2940                 <td>
   2941                   <code>@nosideeffects</code>
   2942                   <p><i>For example:</i></p>
   2943                   <CODE_SNIPPET>
   2944                     /** @nosideeffects */
   2945                     function noSideEffectsFn1() {
   2946                       // ...
   2947                     }
   2948 
   2949                     /** @nosideeffects */
   2950                     var noSideEffectsFn2 = function() {
   2951                       // ...
   2952                     };
   2953 
   2954                     /** @nosideeffects */
   2955                     a.prototype.noSideEffectsFn3 = function() {
   2956                       // ...
   2957                     };
   2958                   </CODE_SNIPPET>
   2959                 </td>
   2960                 <td>
   2961                   This annotation can be used as part of function and
   2962                   constructor declarations to indicate that calls to the
   2963                   declared function have no side-effects.  This annotation
   2964                   allows the compiler to remove calls to these functions if the
   2965                   return value is not used.
   2966                 </td>
   2967               </tr>
   2968 
   2969               <tr>
   2970                 <td><a name="tag-override">@override</a></td>
   2971                 <td>
   2972                   <code>@override</code>
   2973                   <p><i>For example:</i></p>
   2974                   <CODE_SNIPPET>
   2975                     /**
   2976                      * @return {string} Human-readable representation of project.SubClass.
   2977                      * @override
   2978                      */
   2979                     project.SubClass.prototype.toString = function() {
   2980                       // ...
   2981                     };
   2982                   </CODE_SNIPPET>
   2983                 </td>
   2984                 <td>
   2985                   Indicates that a method or property of a subclass
   2986                   intentionally hides a method or property of the superclass. If
   2987                   no other documentation is included, the method or property
   2988                   also inherits documentation from its superclass.
   2989                 </td>
   2990               </tr>
   2991 
   2992               <tr>
   2993                 <td><a name="tag-param">@param</a></td>
   2994                 <td>
   2995                   <code>@param {Type} varname Description</code>
   2996                   <p><i>For example:</i></p>
   2997                   <CODE_SNIPPET>
   2998                     /**
   2999                      * Queries a Baz for items.
   3000                      * @param {number} groupNum Subgroup id to query.
   3001                      * @param {string|number|null} term An itemName,
   3002                      *     or itemId, or null to search everything.
   3003                      */
   3004                     goog.Baz.prototype.query = function(groupNum, term) {
   3005                       // ...
   3006                     };
   3007                   </CODE_SNIPPET>
   3008                 </td>
   3009                 <td>
   3010                   Used with method, function and constructor calls to document
   3011                   the arguments of a function.<p/>
   3012 
   3013                   <a href="#JsTypes">Type</a>
   3014                   names must be enclosed in curly braces. If the type
   3015                   is omitted, the compiler will not type-check the parameter.
   3016                 </td>
   3017               </tr>
   3018 
   3019               <tr>
   3020                 <td><a name="tag-private">@private</a></td>
   3021                 <td>
   3022                   <code>@private</code><br/>
   3023                   <code>@private {type}</code>
   3024                   <p><i>For example:</i></p>
   3025                   <CODE_SNIPPET>
   3026                     /**
   3027                      * Handlers that are listening to this logger.
   3028                      * @private {!Array.&lt;Function&gt;}
   3029                      */
   3030                     this.handlers_ = [];
   3031                   </CODE_SNIPPET>
   3032                 </td>
   3033                 <td>
   3034                   Used in conjunction with a trailing underscore on the method
   3035                   or property name to indicate that the member is
   3036                   <a href="#Visibility__private_and_protected_fields_">private</a> and final.
   3037                 </td>
   3038               </tr>
   3039 
   3040               <tr>
   3041                 <td><a name="tag-protected">@protected</a></td>
   3042                 <td>
   3043                   <code>@protected</code><br/>
   3044                   <code>@protected {type}</code>
   3045                   <p><i>For example:</i></p>
   3046                   <CODE_SNIPPET>
   3047                     /**
   3048                      * Sets the component's root element to the given element.
   3049                      * @param {Element} element Root element for the component.
   3050                      * @protected
   3051                      */
   3052                     goog.ui.Component.prototype.setElementInternal = function(element) {
   3053                       // ...
   3054                     };
   3055                   </CODE_SNIPPET>
   3056                 </td>
   3057                 <td>
   3058                   Used to indicate that the member or property is
   3059                   <a href="#Visibility__private_and_protected_fields_">protected</a>.
   3060                   Should be used in conjunction with names with no trailing
   3061                   underscore.
   3062                 </td>
   3063               </tr>
   3064 
   3065               <tr>
   3066                 <td><a name="tag-public">@public</a></td>
   3067                 <td>
   3068                   <code>@public</code><br/>
   3069                   <code>@public {type}</code>
   3070                   <p><i>For example:</i></p>
   3071                   <CODE_SNIPPET>
   3072                     /**
   3073                      * Whether to cancel the event in internal capture/bubble processing.
   3074                      * @public {boolean}
   3075                      * @suppress {visiblity} Referencing this outside this package is strongly
   3076                      * discouraged.
   3077                      */
   3078                      goog.events.Event.prototype.propagationStopped_ = false;
   3079                   </CODE_SNIPPET>
   3080                 </td>
   3081                 <td>
   3082                   Used to indicate that the member or property is public. Variables and
   3083                   properties are public by default, so this annotation is rarely necessary.
   3084                   Should only be used in legacy code that cannot be easily changed to
   3085                   override the visibility of members that were named as private variables.
   3086                 </td>
   3087               </tr>
   3088 
   3089               <tr>
   3090                 <td><a name="tag-return">@return</a></td>
   3091                 <td>
   3092                   <code>@return {Type} Description</code>
   3093                   <p><i>For example:</i></p>
   3094                   <CODE_SNIPPET>
   3095                     /**
   3096                      * @return {string} The hex ID of the last item.
   3097                      */
   3098                     goog.Baz.prototype.getLastId = function() {
   3099                       // ...
   3100                       return id;
   3101                     };
   3102                   </CODE_SNIPPET>
   3103                 </td>
   3104                 <td>
   3105                   Used with method and function calls to document the return
   3106                   type.  When writing descriptions for boolean parameters,
   3107                   prefer "Whether the component is visible" to "True if the
   3108                   component is visible, false otherwise". If there is no return
   3109                   value, do not use an <code>@return</code> tag.<p/>
   3110 
   3111                   <a href="#JsTypes">Type</a>
   3112                   names must be enclosed in curly braces. If the type
   3113                   is omitted, the compiler will not type-check the return value.
   3114                 </td>
   3115               </tr>
   3116 
   3117               <tr>
   3118                 <td><a name="tag-see">@see</a></td>
   3119                 <td>
   3120                   <code>@see Link</code>
   3121                   <p><i>For example:</i></p>
   3122                   <CODE_SNIPPET>
   3123                     /**
   3124                      * Adds a single item, recklessly.
   3125                      * @see #addSafely
   3126                      * @see goog.Collect
   3127                      * @see goog.RecklessAdder#add
   3128                      ...
   3129                   </CODE_SNIPPET>
   3130                 </td>
   3131                 <td>Reference a lookup to another class function or method.</td>
   3132               </tr>
   3133 
   3134               <tr>
   3135                 <td><a name="tag-struct">@struct</a></td>
   3136                 <td>
   3137                   <code>@struct Description</code>
   3138                   <p><i>For example:</i></p>
   3139                   <CODE_SNIPPET>
   3140                     /**
   3141                      * @constructor
   3142                      * @struct
   3143                      */
   3144                     function Foo(x) {
   3145                       this.x = x;
   3146                     }
   3147                     var obj = new Foo(123);
   3148                     var num = obj['x'];  // warning
   3149                     obj.y = "asdf";  // warning
   3150 
   3151                     Foo.prototype = /** @struct */ {
   3152                       method1: function() {}
   3153                     };
   3154                     Foo.prototype.method2 = function() {};  // warning
   3155                   </CODE_SNIPPET>
   3156                 </td>
   3157                 <td>
   3158                   When a constructor (<code>Foo</code> in the example) is
   3159                   annotated with <code>@struct</code>, you can only use the dot
   3160                   notation to access the properties of <code>Foo</code> objects.
   3161                   Also, you cannot add new properties to <code>Foo</code>
   3162                   objects after they have been created.
   3163                   The annotation can also be used directly on object literals.
   3164                 </td>
   3165               </tr>
   3166 
   3167               <tr>
   3168                 <td><a name="tag-supported">@supported</a></td>
   3169                 <td>
   3170                   <code>@supported Description</code>
   3171                   <p><i>For example:</i></p>
   3172                   <CODE_SNIPPET>
   3173                     /**
   3174                      * @fileoverview Event Manager
   3175                      * Provides an abstracted interface to the
   3176                      * browsers' event systems.
   3177                      * @supported So far tested in IE6 and FF1.5
   3178                      */
   3179                   </CODE_SNIPPET>
   3180                 </td>
   3181                 <td>
   3182                   Used in a fileoverview to indicate what browsers are supported
   3183                   by the file.
   3184                 </td>
   3185               </tr>
   3186 
   3187               <tr>
   3188                 <td><a name="tag-suppress">@suppress</a></td>
   3189                 <td>
   3190                   <code>
   3191                     @suppress {warning1|warning2}
   3192                   </code>
   3193                   <code>
   3194                     @suppress {warning1,warning2}
   3195                   </code>
   3196                   <p><i>For example:</i></p>
   3197                   <CODE_SNIPPET>
   3198                     /**
   3199                      * @suppress {deprecated}
   3200                      */
   3201                     function f() {
   3202                       deprecatedVersionOfF();
   3203                     }
   3204                   </CODE_SNIPPET>
   3205                 </td>
   3206                 <td>
   3207                   Suppresses warnings from tools. Warning categories are
   3208                   separated by <code>|</code> or <code>,</code>.
   3209 
   3210                 </td>
   3211               </tr>
   3212 
   3213               <tr>
   3214                 <td><a name="tag-template">@template</a></td>
   3215                 <td>
   3216                   <code>@template</code>
   3217                   <p><i>For example:</i></p>
   3218                   <CODE_SNIPPET>
   3219                     /**
   3220                      * @param {function(this:T, ...)} fn
   3221                      * @param {T} thisObj
   3222                      * @param {...*} var_args
   3223                      * @template T
   3224                      */
   3225                     goog.bind = function(fn, thisObj, var_args) {
   3226                        ...
   3227                     };
   3228                   </CODE_SNIPPET>
   3229                 </td>
   3230                 <td>
   3231                   This annotation can be used to declare a
   3232                   <a href="#Template_types">template typename</a>.
   3233                 </td>
   3234               </tr>
   3235 
   3236               <tr>
   3237                 <td><a name="tag-this">@this</a></td>
   3238                 <td>
   3239                   <code>
   3240                     @this Type<br/>
   3241                     @this {Type}
   3242                   </code>
   3243                   <p><i>For example:</i></p>
   3244                   <CODE_SNIPPET>
   3245                     pinto.chat.RosterWidget.extern('getRosterElement',
   3246                     /**
   3247                      * Returns the roster widget element.
   3248                      * @this pinto.chat.RosterWidget
   3249                      * @return {Element}
   3250                      */
   3251                     function() {
   3252                       return this.getWrappedComponent_().getElement();
   3253                     });
   3254                   </CODE_SNIPPET>
   3255                 </td>
   3256                 <td>
   3257                   The type of the object in whose context a particular method is
   3258                   called. Required when the <code>this</code> keyword is referenced
   3259                   from a function that is not a prototype method.
   3260                 </td>
   3261               </tr>
   3262 
   3263               <tr>
   3264                 <td><a name="tag-type">@type</a></td>
   3265                 <td>
   3266                   <code>
   3267                     @type Type<br/>
   3268                     @type {Type}
   3269                   </code>
   3270                   <p><i>For example:</i></p>
   3271                   <CODE_SNIPPET>
   3272                     /**
   3273                      * The message hex ID.
   3274                      * @type {string}
   3275                      */
   3276                     var hexId = hexId;
   3277                   </CODE_SNIPPET>
   3278                 </td>
   3279                 <td>
   3280                   Identifies the <a href="#JsTypes">type</a> of a variable,
   3281                   property, or expression. Curly braces are not required around
   3282                   most types, but some projects mandate them for all types, for
   3283                   consistency.
   3284                 </td>
   3285               </tr>
   3286 
   3287               <tr>
   3288                 <td><a name="tag-typedef">@typedef</a></td>
   3289                 <td>
   3290                   <code>@typedef</code>
   3291                   <p><i>For example:</i></p>
   3292                   <CODE_SNIPPET>
   3293                     /** @typedef {(string|number)} */
   3294                     goog.NumberLike;
   3295 
   3296                     /** @param {goog.NumberLike} x A number or a string. */
   3297                     goog.readNumber = function(x) {
   3298                       ...
   3299                     }
   3300                   </CODE_SNIPPET>
   3301                 </td>
   3302                 <td>
   3303                   This annotation can be used to declare an alias of a more
   3304                   <a href="#Typedefs">complex type</a>.
   3305                 </td>
   3306               </tr>
   3307 
   3308 
   3309 
   3310             </tbody>
   3311           </table>
   3312 
   3313 
   3314 
   3315           <p>
   3316             You may also see other types of JSDoc annotations in third-party
   3317             code. These annotations appear in the
   3318             <a href="https://code.google.com/p/jsdoc-toolkit/wiki/TagReference">
   3319               JSDoc Toolkit Tag Reference
   3320             </a>
   3321             but are currently discouraged in Google code. You should consider
   3322             them "reserved" names for future use. These include:
   3323             <ul>
   3324               <li>@augments</li>
   3325               <li>@argument</li>
   3326               <li>@borrows</li>
   3327               <li>@class</li>
   3328               <li>@constant</li>
   3329               <li>@constructs</li>
   3330               <li>@default</li>
   3331               <li>@event</li>
   3332               <li>@example</li>
   3333               <li>@field</li>
   3334               <li>@function</li>
   3335               <li>@ignore</li>
   3336               <li>@inner</li>
   3337               <li>@link</li>
   3338               <li>@memberOf</li>
   3339               <li>@name</li>
   3340               <li>@namespace</li>
   3341               <li>@property</li>
   3342               <li>@public</li>
   3343               <li>@requires</li>
   3344               <li>@returns</li>
   3345               <li>@since</li>
   3346               <li>@static</li>
   3347               <li>@version</li>
   3348             </ul>
   3349           </p>
   3350         </SUBSECTION>
   3351       </BODY>
   3352     </STYLEPOINT>
   3353 
   3354     <STYLEPOINT title="Providing Dependencies With goog.provide">
   3355       <SUMMARY>
   3356         Only provide top-level symbols.
   3357       </SUMMARY>
   3358       <BODY>
   3359         <p>
   3360           All members defined on a class should be in the same file. So, only
   3361           top-level classes should be provided in a file that contains multiple
   3362           members defined on the same class (e.g. enums, inner classes, etc).
   3363         </p>
   3364         <p>Do this:</p>
   3365         <CODE_SNIPPET>
   3366           goog.provide('namespace.MyClass');
   3367         </CODE_SNIPPET>
   3368         <p>Not this:</p>
   3369         <BAD_CODE_SNIPPET>
   3370           goog.provide('namespace.MyClass');
   3371           goog.provide('namespace.MyClass.Enum');
   3372           goog.provide('namespace.MyClass.InnerClass');
   3373           goog.provide('namespace.MyClass.TypeDef');
   3374           goog.provide('namespace.MyClass.CONSTANT');
   3375           goog.provide('namespace.MyClass.staticMethod');
   3376         </BAD_CODE_SNIPPET>
   3377         <p>
   3378           Members on namespaces may also be provided:
   3379         </p>
   3380         <CODE_SNIPPET>
   3381           goog.provide('foo.bar');
   3382           goog.provide('foo.bar.method');
   3383           goog.provide('foo.bar.CONSTANT');
   3384         </CODE_SNIPPET>
   3385       </BODY>
   3386     </STYLEPOINT>
   3387 
   3388     <STYLEPOINT title="Compiling">
   3389       <SUMMARY>Required</SUMMARY>
   3390       <BODY>
   3391 
   3392 
   3393         <p>Use of JS compilers such as the
   3394           <a href="https://code.google.com/closure/compiler/">Closure Compiler</a>
   3395           is required for all customer-facing code.</p>
   3396 
   3397 
   3398 
   3399 
   3400       </BODY>
   3401     </STYLEPOINT>
   3402 
   3403     <STYLEPOINT title="Tips and Tricks">
   3404       <SUMMARY>JavaScript tidbits</SUMMARY>
   3405       <BODY>
   3406         <SUBSECTION title="True and False Boolean Expressions">
   3407           <p>The following are all false in boolean expressions:</p>
   3408           <ul>
   3409             <li><code>null</code></li>
   3410             <li><code>undefined</code></li>
   3411             <li><code>''</code> the empty string</li>
   3412             <li><code>0</code> the number</li>
   3413           </ul>
   3414           <p>But be careful, because these are all true:</p>
   3415           <ul>
   3416             <li><code>'0'</code> the string</li>
   3417             <li><code>[]</code> the empty array</li>
   3418             <li><code>{}</code> the empty object</li>
   3419           </ul>
   3420 
   3421           <p>This means that instead of this:</p>
   3422           <BAD_CODE_SNIPPET>
   3423             while (x != null) {
   3424           </BAD_CODE_SNIPPET>
   3425           <p>you can write this shorter code (as long as you don't expect x to
   3426             be 0, or the empty string, or false):</p>
   3427           <CODE_SNIPPET>
   3428             while (x) {
   3429           </CODE_SNIPPET>
   3430 
   3431           <p>And if you want to check a string to see if it is null or empty,
   3432             you could do this:</p>
   3433           <BAD_CODE_SNIPPET>
   3434             if (y != null &amp;&amp; y != '') {
   3435           </BAD_CODE_SNIPPET>
   3436           <p>But this is shorter and nicer:</p>
   3437           <CODE_SNIPPET>
   3438             if (y) {
   3439           </CODE_SNIPPET>
   3440 
   3441           <p><strong>Caution:</strong> There are many unintuitive things about
   3442             boolean expressions.  Here are some of them:</p>
   3443           <ul>
   3444             <li><code>
   3445               Boolean('0') == true<br/>
   3446               '0' != true</code></li>
   3447             <li><code>
   3448               0 != null<br/>
   3449               0 == []<br/>
   3450               0 == false</code></li>
   3451             <li><code>
   3452               Boolean(null) == false<br/>
   3453               null != true<br/>
   3454               null != false</code></li>
   3455             <li><code>
   3456               Boolean(undefined) == false<br/>
   3457               undefined != true<br/>
   3458               undefined != false</code></li>
   3459             <li><code>
   3460               Boolean([]) == true<br/>
   3461               [] != true<br/>
   3462               [] == false</code></li>
   3463             <li><code>
   3464               Boolean({}) == true<br/>
   3465               {} != true<br/>
   3466               {} != false</code></li>
   3467           </ul>
   3468         </SUBSECTION>
   3469 
   3470         <SUBSECTION title="Conditional (Ternary) Operator (?:)">
   3471           <p>Instead of this:</p>
   3472           <CODE_SNIPPET>
   3473             if (val) {
   3474               return foo();
   3475             } else {
   3476               return bar();
   3477             }
   3478           </CODE_SNIPPET>
   3479           <p>you can write this:</p>
   3480           <CODE_SNIPPET>
   3481             return val ? foo() : bar();
   3482           </CODE_SNIPPET>
   3483 
   3484           <p>The ternary conditional is also useful when generating HTML:</p>
   3485           <CODE_SNIPPET>
   3486             var html = '&lt;input type="checkbox"' +
   3487                 (isChecked ? ' checked' : '') +
   3488                 (isEnabled ? '' : ' disabled') +
   3489                 ' name="foo"&gt;';
   3490           </CODE_SNIPPET>
   3491         </SUBSECTION>
   3492 
   3493         <SUBSECTION title="&amp;&amp; and ||">
   3494           <p>These binary boolean operators are short-circuited, and evaluate
   3495             to the last evaluated term.</p>
   3496 
   3497           <p>"||" has been called the 'default' operator, because instead of
   3498             writing this:</p>
   3499           <BAD_CODE_SNIPPET>
   3500             /** @param {*=} opt_win */
   3501             function foo(opt_win) {
   3502               var win;
   3503               if (opt_win) {
   3504                 win = opt_win;
   3505               } else {
   3506                 win = window;
   3507               }
   3508               // ...
   3509             }
   3510           </BAD_CODE_SNIPPET>
   3511           <p>you can write this:</p>
   3512           <CODE_SNIPPET>
   3513             /** @param {*=} opt_win */
   3514             function foo(opt_win) {
   3515               var win = opt_win || window;
   3516               // ...
   3517             }
   3518           </CODE_SNIPPET>
   3519 
   3520           <p>"&amp;&amp;" is also useful for shortening code. For instance,
   3521             instead of this:</p>
   3522           <BAD_CODE_SNIPPET>
   3523             if (node) {
   3524               if (node.kids) {
   3525                 if (node.kids[index]) {
   3526                   foo(node.kids[index]);
   3527                 }
   3528               }
   3529             }
   3530           </BAD_CODE_SNIPPET>
   3531 
   3532           <p>you could do this:</p>
   3533           <CODE_SNIPPET>
   3534             if (node &amp;&amp; node.kids &amp;&amp; node.kids[index]) {
   3535               foo(node.kids[index]);
   3536             }
   3537           </CODE_SNIPPET>
   3538 
   3539           <p>or this:</p>
   3540           <CODE_SNIPPET>
   3541             var kid = node &amp;&amp; node.kids &amp;&amp; node.kids[index];
   3542             if (kid) {
   3543               foo(kid);
   3544             }
   3545           </CODE_SNIPPET>
   3546 
   3547           <p>However, this is going a little too far:</p>
   3548           <BAD_CODE_SNIPPET>
   3549             node &amp;&amp; node.kids &amp;&amp; node.kids[index] &amp;&amp; foo(node.kids[index]);
   3550           </BAD_CODE_SNIPPET>
   3551         </SUBSECTION>
   3552 
   3553         <SUBSECTION title="Iterating over Node Lists">
   3554           <p>Node lists are often implemented as node iterators with a filter.
   3555             This means that getting a property like length is O(n), and
   3556             iterating over the list by re-checking the length will be
   3557             O(n^2).</p>
   3558           <BAD_CODE_SNIPPET>
   3559             var paragraphs = document.getElementsByTagName('p');
   3560             for (var i = 0; i &lt; paragraphs.length; i++) {
   3561               doSomething(paragraphs[i]);
   3562             }
   3563           </BAD_CODE_SNIPPET>
   3564 
   3565           <p>It is better to do this instead:</p>
   3566           <CODE_SNIPPET>
   3567             var paragraphs = document.getElementsByTagName('p');
   3568             for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) {
   3569               doSomething(paragraph);
   3570             }
   3571           </CODE_SNIPPET>
   3572 
   3573           <p>This works well for all collections and arrays as long as the array
   3574             does not contain things that are treated as boolean false.</p>
   3575 
   3576           <p>In cases where you are iterating over the childNodes you can also
   3577             use the firstChild and nextSibling properties.</p>
   3578           <CODE_SNIPPET>
   3579             var parentNode = document.getElementById('foo');
   3580             for (var child = parentNode.firstChild; child; child = child.nextSibling) {
   3581               doSomething(child);
   3582             }
   3583           </CODE_SNIPPET>
   3584         </SUBSECTION>
   3585       </BODY>
   3586     </STYLEPOINT>
   3587   </CATEGORY>
   3588 
   3589 
   3590 
   3591   <PARTING_WORDS>
   3592     <p>
   3593       <em>BE CONSISTENT</em>.
   3594     </p>
   3595 
   3596     <p>
   3597       If you're editing code, take a few minutes to look at the code
   3598       around you and determine its style.  If they use spaces around
   3599       all their arithmetic operators, you should too.  If their
   3600       comments have little boxes of hash marks around them, make your
   3601       comments have little boxes of hash marks around them too.
   3602     </p>
   3603 
   3604     <p>
   3605       The point of having style guidelines is to have a common vocabulary
   3606       of coding so people can concentrate on what you're saying rather
   3607       than on how you're saying it.  We present global style rules here so
   3608       people know the vocabulary, but local style is also important.  If
   3609       code you add to a file looks drastically different from the existing
   3610       code around it, it throws readers out of their rhythm when they go to
   3611       read it.  Avoid this.
   3612     </p>
   3613 
   3614   </PARTING_WORDS>
   3615 
   3616   <p align="right">
   3617     Revision 2.93
   3618   </p>
   3619 
   3620 
   3621   <address>
   3622     Aaron Whyte<br/>
   3623     Bob Jervis<br/>
   3624     Dan Pupius<br/>
   3625     Erik Arvidsson<br/>
   3626     Fritz Schneider<br/>
   3627     Robby Walker<br/>
   3628   </address>
   3629 </GUIDE>
   3630