我经常看到JavaScript中以美元符号开头的变量。什么时候/为什么选择以这种方式为变量加上前缀?
(我不是问你在jQuery和其他中看到的$('p.foo')语法,而是像$name和$order这样的正常变量)
我经常看到JavaScript中以美元符号开头的变量。什么时候/为什么选择以这种方式为变量加上前缀?
(我不是问你在jQuery和其他中看到的$('p.foo')语法,而是像$name和$order这样的正常变量)
当前回答
${varname}只是jQuery开发人员用来区分包含jQuery元素的变量的命名约定。
Plain {varname}用于存储一般内容,如文本和字符串。 ${varname}保存从jQuery返回的元素。
你也可以使用plain {varname}来存储jQuery元素,但正如我在开始时所说的,这将它与普通变量区别开来,使其更容易理解(想象一下将其混淆为普通变量并搜索以了解它所包含的内容)。
例如:
var $blah = $(this).parents('.blahblah');
这里,blah存储返回的jQuery元素。
因此,当其他人在代码中看到$blah时,他们会明白这不仅仅是一个字符串或数字,而是一个jQuery元素。
其他回答
在ECMAScript的第1版、第2版和第3版中,规范明确禁止使用$前缀的变量名,除非是在自动生成代码的上下文中:
美元符号($)和下划线(_)允许出现在标识符中的任何位置。美元符号仅用于机械生成的代码。
然而,在下一个版本(当前的第5版)中,这一限制被取消了,上面的段落被替换为
美元符号($)和下划线(_)允许出现在IdentifierName中的任何位置。
因此,$符号现在可以在变量名中自由使用。某些框架和库对符号的含义有自己的约定,在这里的其他回答中说明了这一点。
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对象。
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 $$$$$"); }
以上所有的例子都可以。
试一试。
由于变量名开头的_通常用于表示一个私有变量(或至少是一个私有变量),我发现$方便在我自己的简短别名前面添加到泛型代码库。
例如,在使用jQuery时,我更喜欢使用变量$J(而不是仅仅$),在使用php.js时使用$P,等等。
前缀使它在视觉上与其他变量(如我自己的静态变量)不同,提示我代码是某个库或其他库的一部分,一旦他们知道了约定,就不太可能与他人冲突或混淆。
它也不会像对每个库调用重复完全指定的名称那样使代码变得混乱(或需要额外的输入)。
我喜欢把它看作是类似于修饰键扩展单键可能性的作用。
但这只是我自己的习惯。
早在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。这已经足够好了。当我们已经有两个不同的名称时,为什么还要在其中一个名称中添加$呢?
实际上,我在这里没有使用email_field,原因有两个:names_with_下划线不是惯用的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仅仅把$当作另一个字母来表示名称,而且我总是从$(无论什么)调用中返回一个jQuery对象,所以我终于明白了这个模式。我可以使用$(…)调用并删除一些字符,它会产生一个非常不错的名称:
$
("#email")$
(email)
三振出局并不完美,但你可能会明白:删除了一些字符,这两行最终看起来像:
$email
这时我意识到我不需要编写emailElement或emailJQ这样的约定。已经有一个很好的约定在盯着我:从$(whatever)调用中取出一些字符,它就会变成$whatever。
var $email = $("#email"), email = $email[0];
// $email is the jQuery object and email is the DOM object
and:
// 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( ... );
or:
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );