标签 模板与示例 描述
@author @author username@google.com (first last)

示例:

                    
    /**
    * @fileoverview Utilities for handling textareas.
    * @author kuth@google.com (Uthur Pendragon)
    */
                    
                  
文件或测试文件的作者. 一般放在 @fileoverview 注释中.
@code {@code ...}

示例:

                    
    /**
    * Moves to the next position in the selection.
    * Throws {@code goog.iter.StopIteration} when it
    * passes the end of the range.
    * @return {Node} The node at the next position.
    */                    
    goog.dom.RangeIterator.prototype.next = function() {
      // ...
    };
                    
                  
标示文档描述属于代码类型, 以便在生成的文档中被正确地格式化.
@const @const
@const {type}

示例:

                    
    /** @const */ var MY_BEER = 'stout';

    /**
    * My namespace's favorite kind of beer.
    * @const {string}
    */                     
    mynamespace.MY_BEER = 'stout';

    /** @const */ MyClass.MY_BEER = 'stout';

    /**
    * Initializes the request.
    * @const
    */
    mynamespace.Request.prototype.initialize = function() {
      // This method cannot be overridden in a subclass.
    };
                    
                  

标记变量或属性只读和适于内联.

一个用@const标注的变量是一个指向某个值的不可变指针. 如果标注了 @const 的变量和属性被重载, 则 JS 编译器会报警告.

如果能够清楚地推断类型那么可以省略对常数的声明. 关于变量的额外注释可以缺省.

当对方法使用 @const 注解, 则不仅意味着方法不能被重载, 也意味着该方法已经是最终状态, 在子类中也无法重载.

更多关于 @const 的资料查看本指南的相关章节.

@constructor @constructor

示例:

                    
    /**
    * A rectangle.
    * @constructor
    */
    function GM_Rect() {
      //...
    }    
                    
                  
用在类的文档中以标示构造函数.
@define @define {Type} description

示例:

                    
    /** @define {boolean} */
    var TR_FLAGS_ENABLE_DEBUG = true;

    /**
    * @define {boolean} Whether we know at compile-time that
    *     the browser is IE.
    */
                      goog.userAgent.ASSUME_IE = false;
                    
                  
标示一个可能会在编译时被重载的常量. 本例中, 编译器标示 --define='goog.userAgent.ASSUME_IE=true' 可以在构建文件中定义, 用于指定 goog.userAgent.ASSUME_IE 常量是否应该被替换为 true.
@deprecated @deprecated Description

示例:

                    
    /**
    * Determines whether a node is a field.
    * @return {boolean} True if the contents of
    *     the element are editable, but the element
    *     itself is not.
    * @deprecated Use isField().
    */
    BN_EditUtil.isTopEditableField = function(node) {
      // ...
    };
                    
                  
用于告诉函数, 方法或者属性是否应该被继续使用. 应该总能提供替代的调用方法.
@dict @dict Description

示例:

                    
    /**
    * @constructor
    * @dict
    */
    function Foo(x) {
      this['x'] = x;
    }
    var obj = new Foo(123);
    var num = obj.x;  // warning

    (/** @dict */ { x: 1 }).x = 123;  // warning    
                    
                  
当使用 @dict 注解构造函数(本例中是 Foo )时, 你只能使用花括号来访问 Foo 对象的属性. 注解也可以直接作为对象字面量使用.
@enum @enum {Type}

示例:

                    
    /**
    * Enum for tri-state values.
    * @enum {number}
    */
    project.TriState = {
      TRUE: 1,
      FALSE: -1,
      MAYBE: 0
    };
                    
                  
@export @export

示例:

                    
    /** @export */
    foo.MyPublicClass.prototype.myPublicMethod = function() {
      // ...
    };
                    
                  

左侧给出的代码在编译器开启 --generate_exports 标示时会生产如下代码:

                    
    goog.exportSymbol('foo.MyPublicClass.prototype.myPublicMethod',
        foo.MyPublicClass.prototype.myPublicMethod);
                    
                  

这会导出到还未编译的代码中. 使用 @export 注解的代码必须

  1. 包含 //javascript/closure/base.js, 或者
  2. 基于自己的代码体系使用相同的方法签名同时定义 goog.exportSymbolgoog.exportProperty.
@expose @expose

示例:

                    
    /** @expose */
    MyClass.prototype.exposedProperty = 3;
                    
                  

声明一个公开属性. 公开属性无法被编译器以任何方式删除, 重命名, 禁用或优化. 同名属性也将无法被优化.

@expose 永远不应该用于库代码. 因为它会阻止属性被删除.

@extends @extends Type
@extends {Type}

示例:

                    
    /**
    * Immutable empty node list.
    * @constructor
    * @extends goog.ds.BasicNodeList
    */
    goog.ds.EmptyNodeList = function() {
      ...
    };
                    
                  
配合 @constructor 使用, 用以标示一个类继承自其他类. 类型周围的花括号可以缺省.
@externs @externs

示例:

                    
    /**
    * @fileoverview This is an externs file.
    * @externs
    */

    var document;
                    
                  

声明属于外部文件.

@fileoverview @fileoverview Description

示例:

                    
    /**
    * @fileoverview Utilities for doing things that require this very long
    * but not indented comment.
    * @author kuth@google.com (Uthur Pendragon)
    */
                    
                  
让注释块提供文件级信息.
@implements @implements Type
@implements {Type}

示例:

                    
    /**
    * A shape.
    * @interface
    */
    function Shape() {};
    Shape.prototype.draw = function() {};

    /**
    * @constructor
    * @implements {Shape}
    */
    function Square() {};
    Square.prototype.draw = function() {
      ...
    };
                    
                  
配合 @constructor 使用, 用以标示类引入类一个接口. 类型周围的花括号可以缺省.
@inheritDoc @inheritDoc

示例:

                    
    /** @inheritDoc */
    project.SubClass.prototype.toString() {
      // ...
    };
                    
                  

已废弃. 请使用 @override 替代其功能.

标示一个子类的方法或属性有意地隐藏父类的方法或属性, 而拥有完全相同的文档. 注意使用 @inheritDoc 即等同于也使用了 @override.
@interface @interface

示例:

                    
    /**
    * A shape.
    * @interface
    */
    function Shape() {};
    Shape.prototype.draw = function() {};

    /**
    * A polygon.
    * @interface
    * @extends {Shape}
    */
    function Polygon() {};
    Polygon.prototype.getSides = function() {};
                    
                  
用于标示定义了接口的函数.
@lends @lends objectName
@lends {objectName}

示例:

                    
    goog.object.extend(
      Button.prototype,
      /** @lends {Button.prototype} */ {
        isButton: function() { return true; }
      });
                    
                  
标示对象的键应该被视为其他对象的属性. 该注解只能用于对象字面量.

注意花括号中的名字并非其他注解所用的类型名, 而是将属性"借出"的那个对象的名字. 例如, @type {Foo} 意思是" Foo 的实例", 但 @lends {Foo} 的意思却是"构造函数 Foo".

参考 JSDoc 工具文档 来查看关于该注解的更多资料.
@license or @preserve @license Description

示例:

                    
    /**
    * @preserve Copyright 2009 SomeThirdParty.
    * Here is the full license text and copyright
    * notice for this file. Note that the notice can span several
    * lines and is only terminated by the closing star and slash:
    */
                    
                  
任何用 @license 或者 @preserve 注解的内容编译器均予以保留并输出岛文件编译后代码的顶部. 这个注解允许一些重要的提示(如合法证书或者版权信息)在编译期间不变. 换行也会被保留.
@noalias @noalias

示例:

                    
    /** @noalias */
    function Range() {}
                    
                  
用于外部文件中, 向编译器标示, 不应将变量或函数作为编译器向外部传递别名的一部分而对其使用别名.
@nocompile @nocompile

示例:

                    
    /** @nocompile */

    // JavaScript code
                    
                  
用于文件顶部, 告知编译器, 解析该文件但不要编译它. 使用该注解的代码并不需要编译, 在编译测试中应当被忽略(例如 bootstrap 代码). 成对使用.
@nosideeffects @nosideeffects

示例:

                    
    /** @nosideeffects */
    function noSideEffectsFn1() {
      // ...
    }

    /** @nosideeffects */
    var noSideEffectsFn2 = function() {
      // ...
    };

    /** @nosideeffects */
    a.prototype.noSideEffectsFn3 = function() {
      // ...
    };
                    
                  
该注解可用于函数或者构造函数声明的一部分, 用于标示调用该函数不会造成副作用. 这个注解允许编译器在没有使用其返回值时移除对这些函数的调用.
@override @override

示例:

                    
    /**
    * @return {string} Human-readable representation of project.SubClass.
    * @override
    */
    project.SubClass.prototype.toString = function() {
      // ...
    };
                    
                  
标示子类中被隐藏的父类方法和属性. 如果没有包含其他文档, 属性和方法会从其父类继承文档.
@param @param {Type} varname Description

示例:

                    
    /**
    * Queries a Baz for items.
    * @param {number} groupNum Subgroup id to query.
    * @param {string|number|null} term An itemName,
    *     or itemId, or null to search everything.
    */
    goog.Baz.prototype.query = function(groupNum, term) {
      // ...
    };
                    
                  
用于方法, 函数或者构造函数来为函数参数添加文档.

类型名需要括起在花括号中. 如果类型被省略, 则编译器不会检测参数的类型.
@private @private
@private {type}

示例:

                    
    /**
    * Handlers that are listening to this logger.
    * @private {!Array.<Function>}
    */
    this.handlers_ = [];
                    
                  
配合方法和属性名尾部的下划线来标示该成员变量为 私有类型, 且不会再改变(final).
@protected @protected
@protected {type}

示例:

                    
    /**
    * Sets the component's root element to the given element.
    * @param {Element} element Root element for the component.
    * @protected
    */
    goog.ui.Component.prototype.setElementInternal = function(element) {
      // ...
    };
                    
                  
用于标示成员或属性为 受限类型. 应当配合那些名字没有尾部下划线的成员或属性使用.
@public @public
@public {type}

示例:

                    
    /**
    * Whether to cancel the event in internal capture/bubble processing.
    * @public {boolean}
    * @suppress {visiblity} Referencing this outside this package is strongly
    * discouraged.
    */
                      goog.events.Event.prototype.propagationStopped_ = false;
                    
                  
用于标示成员或属性为公共类型. 默认情况下变量和属性就属于公共类型, 因此这条注解很少用到. 仅仅用于一些不会很轻易被作为私有变量重载可见性的成员上.
@return @return {Type} Description

示例:

                    
    /**
    * @return {string} The hex ID of the last item.
    */
    goog.Baz.prototype.getLastId = function() {
      // ...
      return id;
    };
                    
                  
配合方法和函数来为返回值添加文档. 当为布尔量编写描述时, 优先使用"Whether the component is visible"而非"True if the component is visible, false otherwise"这样的句式. 如果无返回值, 则不应该使用 @return 标签.

类型名应当括起在花括号中. 如果类型名被省略, 编译器不会对返回值进行类型检查.
@see @see Link

示例:

                    
    /**
    * Adds a single item, recklessly.
    * @see #addSafely
    * @see goog.Collect
    * @see goog.RecklessAdder#add
    ...
                    
                  
引用一个对其他类的函数和方法的查询.
@struct @struct Description

示例:

                    
    /**
    * @constructor
    * @struct
    */
    function Foo(x) {
      this.x = x;
    }
    var obj = new Foo(123);
    var num = obj['x'];  // warning
    obj.y = "asdf";  // warning
                     
    Foo.prototype = /** @struct */ {
      method1: function() {}
    };
    Foo.prototype.method2 = function() {};  // warning
                    
                  
当对构造函数(本例中为 Foo )使用 @struct 注解后, 你将只能用点运算符去访问 Foo 对象的属性. 同时, 你也无法在创建之后再向 Foo 对象添加新属性. 该注解也可以直接用于对象字面量.
@supported @supported Description

示例:

                    
    /**
    * @fileoverview Event Manager
    * Provides an abstracted interface to the
    * browsers' event systems.
    * @supported So far tested in IE6 and FF1.5
    */
                    
                  
用于文件概述中用于标示支持该文件的浏览器.
@suppress @suppress {warning1|warning2} @suppress {warning1,warning2}

示例:

                    
    /**
    * @suppress {deprecated}
    */
    function f() {
      deprecatedVersionOfF();
    }
                    
                  
抑制工具发出的警告. 警告分类使用 | 或者 , 来分隔.
@template @template

示例:

                    
    /**
    * @param {function(this:T, ...)} fn
    * @param {T} thisObj
    * @param {...*} var_args
    * @template T
    */
    goog.bind = function(fn, thisObj, var_args) {
      ...
    };
                    
                  
该注解用于声明 模板类型名.
@this @this Type
@this {Type}

示例:

                    
    pinto.chat.RosterWidget.extern('getRosterElement',
        /**
        * Returns the roster widget element.
        * @this pinto.chat.RosterWidget
        * @return {Element}
        */
        function() {
          return this.getWrappedComponent_().getElement();
        });
                    
                  
该类型的对象处于一个特定方法被调用的上下文中. 当 this 关键字被一个非原型方法的函数所引用时需要使用该注解.
@type @type Type
@type {Type}

示例:

                    
    /**
    * The message hex ID.
    * @type {string}
    */
    var hexId = hexId;
                    
                  
标示变量, 属性, 表达式的 类型. 一般不要求在变量周围用花括号, 但某些项目会出于一致性考虑对所有类型都这样做.
@typedef @typedef

示例:

                    
    /** @typedef {(string|number)} */
    goog.NumberLike;

    /** @param {goog.NumberLike} x A number or a string. */
    goog.readNumber = function(x) {
      ...
    }
                    
                  
该注解用于声明一个更 复杂类型的别名.