/**
 * @type {number}
 */
var foo1;

/**
 * @type {*}
 * @desc 任何类型
 */
var foo2;

/**
 * @type {?string}
 * @desc string或者null
 */
var foo3;

/**
 * @type {!string}
 * @desc string且不能为null
 */
var foo4;

/**
 * @type {boolean[]}
 * @desc boelean数组
 */
var foo5;

/**
 * @type {(number|string)}
 * @desc number或者string
 */
var foo6;

/**
 * @type {object}
 * @desc 对象
 * @property {string} a - 属性a
 */
var foo7 = {
    a: 'a'
};


/**
 * @func
 * @desc 一个带参数的函数
 * @param {string} a - 参数a
 * @param {number} b=1 - 参数b默认值为1
 * @param {string} c=1 - 参数c有两种支持的取值</br>1—表示x</br>2—表示xx
 * @param {object} d - 参数d为一个对象
 * @param {string} d.e - 参数d的e属性
 * @param {string} d.f - 参数d的f属性
 * @param {object[]} g - 参数g为一个对象数组
 * @param {string} g.h - 参数g数组中一项的h属性
 * @param {string} g.i - 参数g数组中一项的i属性
 * @param {string} [j] - 参数j是一个可选参数
 */
function foo(a, b, c, d, g, j) { }

/**
 * @func
 * @desc 一个带若干参数的函数
 * @param {...string} a - 参数a
 */
function bar(a) { }


/**
 * @func
 * @returns {boolean} 返回值为true
 */
function foo() {
    return true;
}


/**
 * @namespace
 */
var $ = {
}

/**
 * @desc 这是一个变量
 */
var foo;

/**
 * @func
 * @desc 计算两个数值的和
 * @param {number} a - 加数a
 * @param {number} b - 加数b
 * @returns {number} 返回a和b的和
 * @example
 * add(1, 2);    // 返回3
 */
function add(a, b) {
    return a + b;
}

/**
 * @func
 * @todo 这个函数需要优化
 */
function todo() {
}


/**
 * @callback myCallback
 * @desc 这是自定义的type
 * @param {number} a - 参数a
 * @returns {boolean} 返回值
 */
function myCallback(a) {
    return true;
}

/**
 * @func
 * @param {myCallback} a - 参数a是一个回调函数
 */
function myCallbackFN(a) {
}

/**
 * @typedef myType
 * @desc 这是自定义的type
 * @property {number} a - 属性a
 * @property {string} b - 属性b
 */

/**
 * @type myType
 */
var foo;

/**
 *@class
 */
function myClass() {
}

/**
 * @func
 * @this myClass
 * @param {string} a - 参数a
 */
function foo10(a) {
    this.a = a;
}

foo.call(new myClass(), 'a');