为什么 JavaScript 变量会以美元符号开头?

我经常看到 JavaScript 带有以美元符号开头的变量。您何时 / 为什么选择以这种方式为变量添加前缀?

(我不是问您在 jQuery 和其他语言中看到的$('p.foo')语法,而是普通变量,例如$name$order

答案

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

ECMAScript 的第一版 ,第二第三版中 ,规范明确禁止使用 $ 前缀的变量名,除非在自动生成的代码的上下文中:

标识符中的任何位置都可以使用美元符号( $ )和下划线( _ )。美元符号仅适用于机械生成的代码。

但是,在下一版本(当前为第 5 版 )中,此限制已被删除,并且以上段落替换为

IdentifierName 中的任何位置都允许使用美元符号( $ )和下划线( _ )。

因此,现在可以在变量名中自由使用 $ 符号。某些框架和库在符号含义上有自己的约定,在此处的其他答案中也有提及。

var $get = function(id) { return document.getElementById(id); }

在 AngularJS 的上下文中, $前缀仅用于框架代码中的标识符。指示框架的用户不要在自己的标识符中使用它:

角命名空间$$$

为了防止名称与代码发生意外冲突,Angular 在公共对象的名称前添加$ ,在私有对象的名称前添加$$ 。请不要在代码中使用$$$前缀。

资料来源: https : //docs.angularjs.org/api

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
var email = $("#email"), emailElement = $("#email")[0];
// Now email is a jQuery object and emailElement is the first/only DOM element in it
// 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
}
var email = $("#email");
var emailJQ = $(email);
$<del>("#</del>email<del>")</del>
$<del>(</del>email<del>)</del>
$email
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!
}
$('#email').click( ... );
var $email = $('#email');
// Maybe do some other stuff with $email here
$email.click( ... );
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 等。

由于变量名开头的_通常用于表示私有变量(或至少一个打算保持私有的变量),因此我发现$方便地在我自己的简短别名之前添加到通用代码库。

例如,当使用 jQuery 时,我更喜欢使用变量$J (而不是仅$ ),而在使用 php.js 等时使用$P

前缀使它在视觉上与其他变量(例如我自己的静态变量)区分开来,这使我陷入一个事实,即代码是某个库或其他库的一部分,并且一旦他们知道约定,就不太可能与其他冲突或混淆。

它也不会使代码混乱(或要求额外的键入),对于每个库调用都重复一个完全指定的名称。

我喜欢认为它类似于修饰键在扩展单个键可能性方面所做的工作。

但这只是我自己的约定。

正如我在过去四年中所经历的那样,它将使一些人可以轻松地确定变量是指向值 / 对象还是由 jQuery 包装的 DOM 元素

Ex:
var name = 'jQuery';
var lib = {name:'jQuery',version:1.6};

var $dataDiv = $('#myDataDiv');

在上面的示例中,当我看到变量 “$ dataDiv” 时,我可以很容易地说这个变量指向 jQuery 包装的 DOM 元素(在本例中为 div)。而且我还可以调用所有 jQuery 方法,而无需再次包装对象,例如 $ dataDiv.append(),$ dataDiv.html(),$ dataDiv.find()而不是 $($ dataDiv).append()。

希望它能有所帮助。因此,最后要说的是,遵循这种做法是一种很好的做法,但不是强制性的。

尽管您可以简单地使用它为标识符添加前缀,但是应该将其用于生成的代码,例如模板中的替换令牌。