$で始まる変数名 (JavaScript)
買ったまま長いことツンドクだった jQuery Cookbookを最近パラパラと読んでいます。
発行が2年前ということもあり、updateの速いjQueryの解説書としてはもうそろそろ 2nd Editonが出てもおかしくない時期(※)ですので今買うのはあまりお勧めしませんが、basic部分では十分役に立つ内容です。
※ただし2013年1月5日時点ではまだ2nd editionはオライリの近刊予告リストにも入っていません。
パラパラとめくっているうちに、いくつか次のような変数宣言があるのに気が付きました。
var $element = …
var $item = …
JavaScriptで、$で始まる変数宣言というのをみた記憶がなかったので「アレッ」と思いました。
一瞬、著者が perlのコードと書き間違えたのではないかと思ったのですが、同書をよく読むと次のような一説がありました。
"... $ doesn’t have any special meaning in JavaScript—it’s treated just like a letter of the alphabet. It’s simply a popular convention in jQuery code to use the $ prefix as a reminder that the variable contains a reference to a jQuery object ... "
(簡訳)…JavaScriptにおいて「$」はなんら特別の意味は持たない。$はアルファベットの1字とまったく同様に扱われる。慣例的にjQueryのコードでは、ある変数がjQueryオブジェクトへの参照を代入する変数名であることをわかりやすくするため、$を接頭辞として使っているに過ぎない。(jQuery Cookbook P107)
jQueryオブジェクトの参照を保持する変数であることをわかりやすくするため、$で始まる変数名にしているわけです。
さて正直に書くと私が「アレッ」と感じたのは、JavaScriptの変数名は、英字または”_”で始まらないといけないのではと思いこんでいたからです。
実際、「javascript 変数名」で検索してみると、
「JavaScriptの変数名の最初の文字は、必ず、英字または、アンダースコア(_)ではじまる」
という解説をしているサイトが多数あります。
気になって調べたところ、JavaScript(Ecmascript)の仕様書「Ecma-262.pdf」には
以下のように記述されていました(pdf内各所から抜粋)。
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
>VariableDeclaration :
> Identifier
> Identifier Initialiser
>Identifier ::
> IdentifierName but not ReservedWord
>The dollar sign ($) and the underscore (_) are permitted
>anywhere in an IdentifierName.
つまり変数名は予約語ではない識別子でなければならず、識別子中では”_”と”$”はどこに置いてもよいよ、ということです。
対応する日本語ページがないのですが、wikipediaの”JavaScript Syntax”のページ
http://en.wikipedia.org/wiki/ECMAScript_syntax
にはもっと明確に記述してあります。
An identifier must start with a letter, underscore (_), or dollar sign ($); subsequent characters can also be digits (0-9).
(簡約)(変数名に使われる)識別子は文字とアンダースコア(_)、ドル記号($)で始まらなければならず、二文字目以降には数字も許される。
日本語のページでも、比率でいえば正しい説明をしたページの方の方が多いのですが、検索結果上位にでてくる1/3は
「JavaScriptの変数名の最初の文字は、必ず、英字または、アンダースコア(_)ではじまる」
というたぐいの説明をしていました。
無暗に使うのもよくないでしょうが、jQueryの場合のように明確な意図と効能がある場合は慣用則に従うのも悪くないかと思います。
[追記]
コメント欄でご指摘いただいた通り、現在の JavaScript の変数名で使える文字は『基本ユニコード文字は使えるが、(いわゆる)1byte文字のうちの英数字、アンダースコア(_)、ドル記号($)を除く文字は例外的に使えない(変数の先頭ではさらに数字も使えない)』と理解するのが正しいようです(二重否定のわかりにくい文章になってすみません^^;)。
実際、d3.js のソースコードなどを見ると、普通に変数名にユニコード文字が使われています(一部抜粋&整形)。
function nextPoint(λ, φ) { λ *= d3_radians; var cosφ = Math.cos(φ *= d3_radians), x = cosφ * Math.cos(λ), …
ただしこの場合、scriptタグにcharsetを指定したほうが良いようです。
<script src=”http://d3js.org/d3.v3.min.js” charset=”utf-8″></script>
最近のコメント