ECMAScript-262 5th Edition(ES5) 予約語一覧 と その仲間達

ES5 の予約語は以下の4種類

  • Keyword
  • FutureReservedWord
  • NullLiteral
    • null
  • BooleanLiteral
    • false true

Keyword

以下のトークンは、Identifiers には使用できません。
debugger は ES5 で FutureReservedWord から Keyword に昇格しました。

break do instanceof typeof
case else new var
catch finally return void
continue for switch while
debugger function this with
default if throw delete
in try

debugger はステートメントになりました。

// DebuggerStatement : See 12.15
debugger;

FutureReservedWord

以下のトークンは、将来のために予約されており、Identifiers には使用できません。

class enum extends super
const export import

以下のトークンも Strict Mode では FutureReservedWord とみなされます。

implements let private public
yield interface package protected
static

これもトークンといえばトーク

"use strict";
この文字列を見つけると JavaScript エンジンは、甘えを許さない鬼軍曹モード(Strict Mode)になります。

ここから本題

ES5の仕様書に定義されていなくても、歴史的な理由で実際には使えないか Minifier が警告を出すキーワードがあります。

C++Java ライクなキーワード

基本的に使用できないキーワードです。知らずに使うとクロスブラウザな部分でハマリます。
これらの多くはES3 で FutureReservedWord として予約されていました。

int short boolean byte
long char float double
abstract volatile transient final
throws goto native synchronized
昔は予約語

現在は予約語ではありませんが、古い処理系(JavaScript 1.3)では予約語です。

comment label
非推奨キーワード
call closure
特定のブラウザで使えないキーワード
  • IE6
    • window.start()
  • IE
    • window.event
  • Netscape
    • window.Layer
Minifier で警告がでるキーワード

一部のMinifierで警告がでますが、実用上の問題はないようです。

set get require

get / set は アクセッサの定義に使用します。

get PropertyName() { FunctionBody }
set PropertyName( PropertySetParameterList ) { FunctionBody }
特定環境で予約済みのキーワード
XML for each __proto__ __parent__
__defineGetter__ __defineSetter__ __lookupsetter__ __lookupgetter__
グローバル変数と関数

予約語ではありませんが、これらは暗黙のグローバル変数/関数として存在します。
同名の変数/関数を作成したり、代入してはいけません。

undefined Infinity java NaN Packages eval
window オブジェクト
window.print window.name window.length window.parent
window.top window.self window.window
window.self と var self = this;

クロージャー内部から上位の this を参照するために self というローカル変数を作成したことがあると思います。
また、ローカル変数の self を下位のメソッドに引数として渡す場合もあると思います。

var self = this;
function() {
  self.xxx;
  hoge(self); // selfを渡す
}
function hoge(context) {
}

window.self がグローバル変数として存在するため、this を self に保存するという戦略はブラウザ上で動作するJavaScript だと結構微妙かもです。

仕様では、window.self は READ-ONLY で windowへの参照を持つらしいのですが、↓のようなうっかりさんなコードは、

self = this;

Firefox3.6, Google Chrome5 では window.self を上書きできてしまい、Opera10.50では無視され、IE8では「実装されていません」と謎のエラーになります。

that なんてどうでしょう。

var that = this;
function() {
  that.xxx;
}

that はアレ(手が届かない)。 this はコレ(手が届く) という距離感の意味合いもあり、クロージャの中から上位の this に触れないというもどかしさを、self に比べて的確に表現できています。

id属性によるGlobalスコープの汚染

大抵のブラウザは、

<div id="hoge" />
<div id="huga" />
<div id="piyo" />

とすると、window.hoge, window.huga, window.piyo で div ノードを参照できます。
この特性を知らずにフリーダムな id 名をつけてしまうと、謎現象に悩まされます。

えと、

間違ってたり、足りないものがあれば教えてください。