## 命名
通常, 使用 `functionNamesLikeThis`, `variableNamesLikeThis`, `ClassNamesLikeThis`, `EnumNamesLikeThis`, `methodNamesLikeThis`, 和 `SYMBOLIC_CONSTANTS_LIKE_THIS`.
展開見細節.
### 屬性和方法
* 文件或類中的 _私有_ 屬性, 變量和方法名應該以下劃線 “_” 開頭.
* _保護_ 屬性, 變量和方法名不需要下劃線開頭, 和公共變量名一樣.
更多有關 _私有_ 和 _保護_的信息見, [visibility](#Visibility__private_and_protected_fields_).
### 方法和函數參數
可選參數以 `opt_` 開頭.
函數的參數個數不固定時, 應該添加最后一個參數 `var_args` 為參數的個數. 你也可以不設置 `var_args`而取代使用 `arguments`.
可選和可變參數應該在 `@param` 標記中說明清楚. 雖然這兩個規定對編譯器沒有任何影響, 但還是請盡量遵守
### Getters 和 Setters
Getters 和 setters 并不是必要的. 但只要使用它們了, 就請將 getters 命名成 `getFoo()` 形式, 將 setters 命名成 `setFoo(value)` 形式. (對于布爾類型的 getters, 使用 `isFoo()` 也可.)
### 命名空間
JavaScript 不支持包和命名空間.
不容易發現和調試全局命名的沖突, 多個系統集成時還可能因為命名沖突導致很嚴重的問題.
為了提高 JavaScript 代碼復用率, 我們遵循下面的約定以避免沖突.
### 為全局代碼使用命名空間
在全局作用域上, 使用一個唯一的, 與工程/庫相關的名字作為前綴標識. 比如, 你的工程是 “Project Sloth”, 那么命名空間前綴可取為 `sloth.*`.
```
var sloth = {};
sloth.sleep = function() {
...
};
```
許多 JavaScript 庫, 包括[the Closure Library](http://code.google.com/closure/library/)and[Dojo toolkit](http://www.dojotoolkit.org/)為你提供了聲明你自己的命名空間的函數. 比如:
```
goog.provide('sloth');
sloth.sleep = function() {
...
};
```
### 明確命名空間所有權
當選擇了一個子命名空間, 請確保父命名空間的負責人知道你在用哪個子命名空間, 比如說, 你為工程 ‘sloths’ 創建一個 ‘hats’ 子命名空間, 那確保 Sloth 團隊人員知道你在使用 `sloth.hats`.
### 外部代碼和內部代碼使用不同的命名空間
“外部代碼” 是指來自于你代碼體系的外部, 可以獨立編譯. 內外部命名應該嚴格保持獨立.
如果你使用了外部庫, 他的所有對象都在 `foo.hats.*` 下, 那么你自己的代碼不能在 `foo.hats.*`下命名, 因為很有可能其他團隊也在其中命名.
```
foo.require('foo.hats');
/**
* WRONG -- Do NOT do this.
* @constructor
* @extend {foo.hats.RoundHat}
*/
foo.hats.BowlerHat = function() {
};
```
如果你需要在外部命名空間中定義新的 API, 那么你應該直接導出一份外部庫, 然后在這份代碼中修改.
在你的內部代碼中, 應該通過他們的內部名字來調用內部 API , 這樣保持一致性可讓編譯器更好的優化你的代碼.
```
foo.provide('googleyhats.BowlerHat');
foo.require('foo.hats');
/**
* @constructor
* @extend {foo.hats.RoundHat}
*/
googleyhats.BowlerHat = function() {
...
};
goog.exportSymbol('foo.hats.BowlerHat', googleyhats.BowlerHat);
```
重命名那些名字很長的變量, 提高可讀性
主要是為了提高可讀性. 局部空間中的變量別名只需要取原名字的最后部分.
```
/**
* @constructor
*/
some.long.namespace.MyClass = function() {
};
/**
* @param {some.long.namespace.MyClass} a
*/
some.long.namespace.MyClass.staticHelper = function(a) {
...
};
myapp.main = function() {
var MyClass = some.long.namespace.MyClass;
var staticHelper = some.long.namespace.MyClass.staticHelper;
staticHelper(new MyClass());
};
```
不要對命名空間創建別名.
```
myapp.main = function() {
var namespace = some.long.namespace;
namespace.MyClass.staticHelper(new namespace.MyClass());
};
```
除非是枚舉類型, 不然不要訪問別名變量的屬性.
```
/** @enum {string} */
some.long.namespace.Fruit = {
APPLE: 'a',
BANANA: 'b'
};
myapp.main = function() {
var Fruit = some.long.namespace.Fruit;
switch (fruit) {
case Fruit.APPLE:
...
case Fruit.BANANA:
...
}
};
```
```
myapp.main = function() {
var MyClass = some.long.namespace.MyClass;
MyClass.staticHelper(null);
};
```
不要在全局范圍內創建別名, 而僅在函數塊作用域中使用.
### 文件名
文件名應該使用小寫字符, 以避免在有些系統平臺上不識別大小寫的命名方式. 文件名以`.js`結尾, 不要包含除 `-` 和 `_` 外的標點符號(使用 `-` 優于 `_`).