代码之家  ›  专栏  ›  技术社区  ›  Ken

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

  •  941
  • Ken  · 技术社区  · 16 年前

    我经常看到以美元符号开头的变量的javascript。什么时候/为什么选择以这种方式给变量加前缀?

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

    16 回复  |  直到 7 年前
        1
  •  1306
  •   jonstjohn    16 年前

    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对象。

        2
  •  228
  •   Mark Amery Harley Holcombe    11 年前

    在第一,第二,和 3rd Edition of ECMAScript 规范明确不鼓励使用带$-前缀的变量名,除非是在自动生成代码的上下文中:

    美元符号( $ )和下划线( _ )在标识符的任何位置都允许。美元符号仅用于机械生成的代码。

    但是,在下一个版本中 5th Edition ,这是当前的),此限制被取消,上面的通道被替换为

    美元符号( $ )和下划线( γ )允许在 标识名 .

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

        3
  •  57
  •   Mog    13 年前

    正如其他人所提到的,美元符号旨在被机械生成的代码使用。然而,这种约定已经被一些广受欢迎的JavaScript库打破了。jquery、prototype和ms-ajax(aka-atlas)都在它们的标识符中使用这个字符(或者作为一个完整的标识符)。

    简而言之,您可以使用 $ 随时随地。(翻译不会抱怨)问题是你什么时候来 希望 使用它?

    我个人不使用它,但我认为它的使用是有效的。我认为MS Ajax使用它来表示函数是一些更详细的调用的别名。

    例如:

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

    这似乎是一个合理的惯例。

        4
  •  51
  •   Travis Watson    10 年前

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

    角度命名空间 $ $$

    为了防止意外的名称与代码冲突,角度前缀将公共对象的名称 $ 私人物品的名称 $$ . 请不要使用 $ $$ 代码中的前缀。

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

        5
  •  21
  •   Michael Geary    7 年前

    我是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 . 那就足够了。为什么我们要扔一个 $ 当我们已经有了两个不同的名字时,我们会把它变成一个名字吗?

    实际上,我不会用 电子邮件字段 这里有两个原因: 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
    }
    

    好吧,这有点令人困惑!在我的一段代码中, 电子邮件 是jquery对象,并且 emailElement 是dom元素,但在另一个元素中, 电子邮件 是dom元素,并且 emailJQ 是jquery对象。

    没有一致性,我一直把它们混在一起。另外,为了同一件事,必须用两个不同的名称来组合,这有点麻烦:一个用于jquery对象,另一个用于匹配的dom元素。此外 电子邮件 , 电子邮件元件 埃米尔JQ 我也一直在尝试其他的变种。

    然后我注意到一个常见的模式:

    var email = $("#email");
    var emailJQ = $(email);
    

    因为javascript处理 $ 作为名称的另一个字母,由于我总是从 $(whatever) 打电话来,我终于明白了这个模式。我可以拿一个 $(...) 打电话删除一些字符,就会得到一个很好的名字:

    $("#email")
    $(email)
    

    删除不完美,但您可能会想到:删除某些字符后,这两行的结尾看起来都像:

    $email
    

    那时我才意识到我不需要像 电子邮件元件 埃米尔JQ . 已经有一个很好的惯例在盯着我看:从一个 美元(无论什么) 然后它变成 $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!
    }
    

    所以我不必一直编两个不同的名字,只需要用同一个名字加上或不加上 $ 前缀。以及 $ prefix是一个很好的提醒,提醒我正在处理一个jquery对象:

    $('#email').click( ... );
    

    或:

    var $email = $('#email');
    // Maybe do some other stuff with $email here
    $email.click( ... );
    
        6
  •  20
  •   Matt user129975    13 年前

    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 $$$$$"); }
    

    上面所有的例子都可以。

    试试看。

        7
  •  7
  •   Stevo    16 年前

    对于javascript引擎,$字符没有特殊意义。它只是变量名中的另一个有效字符,如a-z、a-z、u0-9等…

        8
  •  2
  •   Brett Zamir    11 年前

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

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

    前缀使其在视觉上与其他变量(如我自己的静态变量)不同,包括代码是某个库或其他库的一部分,并且一旦知道约定,就不太可能与其他变量冲突或混淆。

    它也不会使代码混乱(或者需要额外的输入),就像为每个库调用重复一个完全指定的名称一样。

    我喜欢把它想象成类似于修改键在扩展单个键的可能性方面所做的工作。

    但这只是我自己的惯例。

        9
  •  2
  •   Naga Srinu Kapusetti    9 年前

    正如我在过去4年中所经历的,它将允许一些人轻松地识别指向值/对象的变量或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()。

    希望能有所帮助。 所以最后要说的是,遵循这一点是一个很好的实践,但不是强制性的。

        10
  •  0
  •   Ryan Abbott    16 年前

    虽然您可以简单地使用它作为标识符的前缀,但它应该用于生成的代码,例如模板中的替换标记。

        11
  •  0
  •   ketan    10 年前

    ${varname} 只是jquery开发人员用来区分保存jquery元素的变量的命名约定。

    平原 {varname} 用于存储文本和字符串等常规内容。 ${ValNe} 保留jquery返回的元素。

    你可以用普通的 {ValNe} 同时存储jquery元素,但是正如我在开始时所说的,这将它与普通变量区别开来,并使其更容易理解(想象一下将它混淆为普通变量,然后到处搜索以了解它包含的内容)。

    例如:

    var $blah = $(this).parents('.blahblah');
    

    这里,blah正在存储返回的jquery元素。

    所以,当别人看到 $blah 在代码中,他们会理解它不仅仅是一个字符串或数字,而是一个jquery元素。

        12
  •  -2
  •   Manish Jhawar    13 年前

    Angular 用于框架生成的属性。猜猜看,他们按照ECMA-2623.0提供的提示(现在已经失效)。

        13
  •  -2
  •   Happy Singh    12 年前

    $用于在常规变量的情况下区分公共变量和jquery变量。 让您在Flipkart中下订单,然后如果订单是一个显示字符串输出的变量,那么它被命名为简单的“订单”,但是如果我们单击“下订单”,则返回一个对象,该对象将用$表示为“$order”,这样程序员就可以截取整个代码中的javascript变量和jquery变量。

        14
  •  -3
  •   RussellW    14 年前

    如果您看到美元符号($)或双美元符号($),并且对原型框架中这意味着什么感到好奇,那么下面是您的答案:

    $$('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

        15
  •  -4
  •   not-just-yeti    14 年前

    我有时将PHP名称约定与JavaScript变量一起使用的原因是: 在进行输入验证时,我希望在客户端运行完全相同的算法, 以及服务器端。我真的希望代码的两面看起来尽可能相似,以简化维护。在变量名中使用美元符号使这变得容易。

    (此外,一些明智的助手函数有助于使代码看起来类似,例如包装输入值查找、strlen的非oo版本、substr等。不过,它仍然需要一些手动调整。)

        16
  •  -4
  •   Pang Ajmal PraveeN    9 年前

    有效的javascript标识符shuold必须以字母开头, 下划线(u)或美元符号($); 后续字符也可以 是数字(0-9)。因为javascript区分大小写, 信件 包括字符“A”到“Z”(大写)和 字符“a”到“z”(小写)。

    细节:
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Grammar_and_types#Variables