我经常看到JavaScript中以美元符号开头的变量。什么时候/为什么选择以这种方式为变量加上前缀?
(我不是问你在jQuery和其他中看到的$('p.foo')语法,而是像$name和$order这样的正常变量)
我经常看到JavaScript中以美元符号开头的变量。什么时候/为什么选择以这种方式为变量加上前缀?
(我不是问你在jQuery和其他中看到的$('p.foo')语法,而是像$name和$order这样的正常变量)
当前回答
我有时在javascript变量中使用php名称约定的原因: 当进行输入验证时,我想在客户端运行完全相同的算法, 和服务器端。我真的希望两边的代码看起来尽可能相似,以简化维护。在变量名中使用美元符号会更容易。
(此外,一些明智的帮助函数有助于使代码看起来相似,例如包装输入值查找,strlen的非oo版本,substr等。不过,它仍然需要一些手动调整。)
其他回答
正如我在过去4年的经验,它将允许一些人很容易地识别变量是否指向值/对象或jQuery包装的DOM元素
前任: 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()。
希望能有所帮助。 所以最后想说的是,这将是一个很好的实践,但不是强制性的。
早在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( ... );
$用于区分普通变量和jquery变量。 让你在FLIPKART下订单,然后如果订单是一个变量,显示你的字符串输出,然后它被命名为简单的“order”,但如果我们点击place order,然后返回一个对象,该对象将用$表示为“$order”,以便程序员可以在整个代码中剪掉javascript变量和jquery变量。
我有时在javascript变量中使用php名称约定的原因: 当进行输入验证时,我想在客户端运行完全相同的算法, 和服务器端。我真的希望两边的代码看起来尽可能相似,以简化维护。在变量名中使用美元符号会更容易。
(此外,一些明智的帮助函数有助于使代码看起来相似,例如包装输入值查找,strlen的非oo版本,substr等。不过,它仍然需要一些手动调整。)
如果你看到美元符号($)或双美元符号($$),并想知道这在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'
来源: http://www.prototypejs.org/api/utility/dollar-dollar