ドル記号で始まる変数を持つ JavaScript をよく見かけます。このように変数に接頭辞を付けるのは、いつ/なぜですか?
$('p.foo')
( jQuery などで見られる構文について質問しているわけではありませんが、 $name
andなどの通常の変数について質問しています$order
)
ドル記号で始まる変数を持つ JavaScript をよく見かけます。このように変数に接頭辞を付けるのは、いつ/なぜですか?
$('p.foo')
( jQuery などで見られる構文について質問しているわけではありませんが、 $name
andなどの通常の変数について質問しています$order
)
jQueryの非常に一般的な用途は、変数に格納されているjQueryオブジェクトを他の変数 と区別することです。
たとえば、次のように定義します。
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
これは、 jQueryコードを記述するのに非常に役立ち、さまざまなプロパティ セットを持つjQueryオブジェクトを簡単に確認できるようになります。
ECMAScriptの第 1 版、第 2 版、および第 3 版では、自動生成されたコードのコンテキストを除いて、$ プレフィックス付きの変数名を使用することは仕様によって明示的に推奨されていませんでした。
ドル記号 (
$
) とアンダースコア (_
) は、識別子のどこにでも使用できます。ドル記号は、機械的に生成されたコードでのみ使用することを意図しています。
ただし、次のバージョン (現在の第 5 版) では、この制限が削除され、上記の文章が次のように置き換えられました。
ドル記号 (
$
) とアンダースコア ( ) は、 IdentifierName_
のどこでも使用できます。
そのため、変数名で $ 記号を自由に使用できるようになりました。特定のフレームワークとライブラリには、シンボルの意味に関する独自の規則があり、ここの他の回答に記載されています。
他の人が言及しているように、ドル記号は機械的に生成されたコードで使用されることを意図しています。ただし、その慣習は、非常に人気のある JavaScript ライブラリによって破られています。JQuery、Prototype、および MS AJAX (AKA Atlas) はすべて、この文字を識別子 (または識別子全体) として使用します。
つまり、必要なときに$
いつでも使用できます。(通訳者は文句を言いません。)問題は、いつそれを使いたいですか?
個人的には使っていませんが、その使い方は有効だと思います。MS AJAX は、関数がより詳細な呼び出しのエイリアスであることを示すために使用していると思います。
例えば:
var $get = function(id) { return document.getElementById(id); }
それは合理的な慣習のようです。
AngularJSのコンテキストでは、$
プレフィックスはフレームワークのコード内の識別子にのみ使用されます。フレームワークのユーザーは、自分の識別子でフレームワークを使用しないように指示されています。
Angular名前空間
$
と$$
コードとの偶発的な名前の衝突を防ぐために、Angularはパブリックオブジェクトの
$
名前に。を付け、プライベートオブジェクトの名前に。を付け$$
ます。$
コードでまたは$$
プレフィックスを使用しないでください。
私は 2006 年にこの規約を発案し、初期の jQuery メーリング リストで推進した人物です。その歴史と動機の一部を共有させてください。
受け入れられた答えは、この例を示しています:
var $email = $("#email"); // refers to the jQuery object representation of the dom object
var email_field = $("#email").get(0); // refers to the dom object itself
しかし、それは実際にはうまく説明できません。がなくても$
、ここにはemail
と の 2 つの異なる変数名がありemail_field
ます。それはそれで十分です。$
すでに 2 つの異なる名前があるのに、名前の 1 つにa をスローする必要があるのはなぜですか?
実際には、email_field
ここでは 2 つの理由で使用しませんでした:names_with_underscores
慣用的な JavaScript でfield
はないことと、DOM 要素としてはあまり意味がありません。しかし、私は同じ考えに従いました。
私はいくつかの異なることを試しましたが、その中には例に非常に似たものがあります:
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
(もちろん、jQuery オブジェクトは複数の DOM 要素を持つことができますが、私が取り組んでいたコードには多くのid
セレクターがあったため、その場合は 1 対 1 の対応がありました。)
関数がパラメーターとして DOM 要素を受け取り、そのための jQuery オブジェクトも必要とする別のケースがありました。
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var emailJQ = $(email);
// Now email is the DOM element and emailJQ is a jQuery object for it
}
ちょっと紛らわしいですね!私のコードの 1 つはemail
jQuery オブジェクトでemailElement
あり、DOM 要素ですが、もう 1 つのコードemail
は DOM 要素でemailJQ
あり、jQuery オブジェクトです。
一貫性がなく、私はそれらを混ぜ続けました。さらに、同じものに対して 2 つの異なる名前を作成しなければならないのは少し面倒でした。1 つは jQuery オブジェクト用で、もう 1 つは一致する DOM 要素用です。email
、emailElement
、以外にも、emailJQ
他のバリエーションも試してみました。
次に、共通のパターンに気付きました。
var email = $("#email");
var emailJQ = $(email);
JavaScript は$
単なる名前の別の文字として扱われるため、呼び出しからは常に jQuery オブジェクトが返されるため$(whatever)
、このパターンがようやく頭に浮かびました。$(...)
電話に出て、いくつかの文字を削除するだけで、かなり素敵な名前を思いつくことができます。
$
("#email")$
(email)
ストライクアウトは完璧ではありませんが、いくつかの文字を削除すると、これらの行は両方とも次のようになります。
$email
emailElement
そのとき、やのような規則を作る必要がないことに気付きましたemailJQ
。私を見つめている素敵な慣習がすでにありました。$(whatever)
通話からいくつかの文字を取り出すと、 $whatever
.
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
と:
// email is a DOM element passed into this function
function doSomethingWithEmail( email ) {
var $email = $(email);
// $email is the jQuery object and email is the DOM object
// Same names as in the code above. Yay!
}
そのため、常に 2 つの異なる名前を作成する必要はなく、$
接頭辞の有無にかかわらず同じ名前を使用できました。そして、$
接頭辞は、私が jQuery オブジェクトを扱っていることを思い出させてくれました。
$('#email').click( ... );
また:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
Stevo の言うとおりです。ドル記号の意味と使用法 (Javascript と jQuery プラットフォームでは、PHP ではなく) は完全にセマンティックです。$ は、識別子名の一部として使用できる文字です。さらに、おそらくドル記号は、Javascript で遭遇する最も「奇妙な」ものではありません。有効な識別子名の例を次に示します。
var _ = function() { alert("hello from _"); }
var \u0024 = function() { alert("hello from $ defined as u0024"); }
var Ø = function() { alert("hello from Ø"); }
var $$$$$ = function() { alert("hello from $$$$$"); }
上記の例はすべて機能します。
それらを試してみてください。
$文字は、JavaScriptエンジンにとって特別な意味はありません。これは、az、AZ、_、0-9などの変数名のもう1つの有効な文字です。
私が過去 4 年間経験してきたように、変数が値/オブジェクトを指しているか、jQuery でラップされた DOM 要素であるかを簡単に特定できるようになります。
Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};
var $dataDiv = $('#myDataDiv');
上記の例で変数「$dataDiv」が表示された場合、この変数が jQuery でラップされた DOM 要素 (この場合は div) を指していると簡単に言えます。また、$($dataDiv).append() の代わりに、$dataDiv.append()、$dataDiv.html()、$dataDiv.find() のように、オブジェクトを再度ラップすることなく、すべての jQuery メソッドを呼び出すことができます。
それが助けになることを願っています。最後に、これに従うことは良い習慣ですが、必須ではないと言いたいです。
${varname}
は、jQuery 開発者が jQuery 要素を保持している変数を区別するために使用する命名規則にすぎません。
プレーン{varname}
は、テキストや文字列などの一般的なものを保存するために使用されます。
${varname}
jQuery から返された要素を保持します。
プレーン{varname}
を使用して jQuery 要素を保存することもできますが、最初に述べたように、これによりプレーン変数と区別され、理解しやすくなります (プレーン変数と混同し、それが保持するものを理解するために全体を検索することを想像してください)。 .
例えば :
var $blah = $(this).parents('.blahblah');
ここでは、何とか返された jQuery 要素を格納しています。
したがって、他の誰かが$blah
コード内の を見たとき、それが単なる文字列や数値ではなく、jQuery 要素であることを理解するでしょう。
_
変数名の先頭では、プライベート変数 (または少なくとも 1 つのプライベート変数) を示すために使用されることが多いため、一般$
的なコード ライブラリへの独自の短いエイリアスの前に追加すると便利です。
たとえば、jQuery を使用する場合、変数$J
を (単に ではなく$
) 使用$P
し、php.js を使用する場合などに使用することを好みます。
接頭辞は、私自身の静的変数などの他の変数と視覚的に区別できるようにし、コードが何らかのライブラリまたはその他の一部であるという事実に私を導き、慣習を知っていれば他の人が競合したり混乱したりする可能性が低くなります.
また、ライブラリ呼び出しごとに繰り返される完全に指定された名前のように、コードが乱雑になる (または追加の入力が必要になる) こともありません。
私はそれを、単一のキーの可能性を拡張するために修飾キーが行うことと似ていると考えるのが好きです.
しかし、これは私自身の慣習です。
単純に識別子のプレフィックスとして使用できますが、たとえば、テンプレート内の置換トークンなど、生成されたコードに使用することになっています。
Angularの用途は、フレームワークによって生成されたプロパティです。おそらく、彼らは ECMA-262 3.0 によって提供される (現在は廃止された) ヒントに従っていると思います。
ドル記号 ($) または二重ドル記号 ($$) が表示され、Prototype フレームワークでこれが何を意味するのか知りたい場合は、次のように答えます。
$$('div');
// -> all DIVs in the document. Same as document.getElementsByTagName('div')!
$$('#contents');
// -> same as $('contents'), only it returns an array anyway (even though IDs must be unique within a document).
$$('li.faux');
// -> all LI elements with class 'faux'
私が時々 javascript 変数で php の命名規則を使用する理由: 入力の検証を行うとき、クライアント側とサーバー側の両方でまったく同じアルゴリズムを実行したいと考えています。メンテナンスを簡素化するために、コードの 2 つの側面をできるだけ似たものにしたいのです。変数名にドル記号を使用すると、これが簡単になります。
(また、いくつかの賢明なヘルパー関数は、コードを似たものにするのに役立ちます。たとえば、input-value-lookup、非 OO バージョンの strlen、substr などをラップします。ただし、それでも手動で微調整する必要があります。)
有効な JavaScript 識別子は、文字、アンダースコア (_)、またはドル記号 ($) で始まる必要があります。後続の文字は数字 (0 ~ 9) にすることもできます。JavaScript では大文字と小文字が区別されるため、文字には "A" から "Z" (大文字) の文字と "a" から "z" (小文字) の文字が含まれます。
詳細:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables