我经常看到 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 版中,规范明确不鼓励使用 $-prefixed 变量名,除了在自动生成代码的上下文中:
美元符号 (
$
) 和下划线 (_
) 可用于标识符中的任何位置。美元符号仅用于机械生成的代码。
但是,在下一个版本(当前的第 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
和email_field
。那里很好。$
当我们已经有两个不同的名称时,为什么我们需要将 a放入其中一个名称中?
实际上,我不会在email_field
这里使用有两个原因: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
}
嗯,这有点令人困惑!在我的一段代码中,email
是 jQuery 对象并且emailElement
是 DOM 元素,但在另一段代码中,是email
DOM 元素并且emailJQ
是 jQuery 对象。
没有一致性,我一直把它们混在一起。另外,为同一事物不断地组成两个不同的名称有点麻烦:一个用于 jQuery 对象,另一个用于匹配的 DOM 元素。除了email
, emailElement
, 和emailJQ
,我也一直在尝试其他变体。
然后我注意到一个常见的模式:
var email = $("#email");
var emailJQ = $(email);
由于 JavaScript 仅将$
名称视为另一个字母,而且我总是从$(whatever)
调用中返回一个 jQuery 对象,因此我终于意识到了这种模式。我可以接听$(...)
电话并删除一些字符,它会想出一个非常好的名字:
$
("#email")$
(email)
Strikeout 并不完美,但您可能会想到:删除一些字符后,这两行最终看起来像:
$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!
}
所以我不必一直组成两个不同的名称,而是可以使用带有或不带有$
前缀的相同名称。而$
前缀是一个很好的提醒,我处理的是一个jQuery对象:
$('#email').click( ... );
或者:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );