【问题标题】:In Javascript, what does this underscore mean?在 Javascript 中,这个下划线是什么意思?
【发布时间】:2011-11-27 20:26:19
【问题描述】:
var Gallery = Backbone.Controller.extend({
    _index: null,
    _photos: null,
    _album :null,
    _subalbums:null,
    _subphotos:null,
    _data:null,
    _photosview:null,
    _currentsub:null,
    routes: {
        "": "index",
        "subalbum/:id": "subindex",
        "subalbum/:id/" : "directphoto",
        "subalbum/:id/:num" : "hashphoto"
    },
    initialize: function(options) {
        var ws = this;
        if (this._index === null){
            $.ajax({
                url: 'data/album1.json',
                dataType: 'json',
                data: {},
                success: function(data) {
                    ws._data = data;
                    ws._photos =
                    new PhotoCollection(data);
                    ws._index =
                    new IndexView({model: ws._photos});
                    Backbone.history.loadUrl();
                }
            });
            return this;
        }
        return this;
    },
    //Handle rendering the initial view for the
    //application
    index: function() {
        this._index.render();
    },

我正在阅读关于backbone.js 的教程:http://addyosmani.com/blog/building-spas-jquerys-best-friends/

什么是下划线? (_index, _photos, _album) 为什么要使用它们?

【问题讨论】:

标签: javascript oop backbone.js


【解决方案1】:

表示私有字段或私有方法。仅供内部使用的方法。

不应在类之外调用它们。

私有字段包含供内部使用的数据。

不应从课堂外(直接)读取或写入它们。

注意:非常重要的是要注意,仅在变量中添加下划线并不会使其成为私有变量,它只是一种命名约定。

【讨论】:

  • 至少,私有字段的想法是存在的,但它们并不是真正私有的,您无论如何都可以访问它们。上述代码的作者只是为了让他们保密。就是这样。
  • 太棒了,不知道为什么我花了这么长时间才找到这个!谢谢。
【解决方案2】:

据我所知,它通常用于表示私有变量(但实际上并不提供任何隐私,只是一种约定)。

这里对此进行了简要讨论,但建议不要: http://javascript.crockford.com/code.html

【讨论】:

  • 我喜欢这个链接:“避免表现出缺乏能力的约定。” :-)
  • 我在调试时将它们用作快捷方式,尤其是在使用 Promises 和其他异步内容时。例如访问我的对象的某些属性的“官方”方式可能是myObj.getSmePromise().then( function(o) { do stuff } );,但在 Chrome 控制台上输入很痛苦,所以我设置了myObj._someValue,因为理解“正确的代码”实际上不会访问它 - 这个然而,我的同事们也知道这个约定,如果你正在编写下一个 jQuery/lodash/angular/react 或其他任何东西,我不会依赖你所有的用户都知道或尊重这一点!
【解决方案3】:

当像_varname 一样使用时,它只是变量名的一部分,没有javascript 含义。开发人员使用它来表示变量的含义或范围。在这种情况下,它看起来像是在告诉开发人员这个变量应该是本地变量或私有变量。

有几点需要注意,在此特定示例中,使用 _.varname 将表示带有 underscore.js 库的变量或函数。也可以使用_varname 表示包含下划线对象的变量,类似地在我们的办公室,我们使用$varname 表示包含Jquery 对象的变量。

【讨论】:

    【解决方案4】:

    它可能用于标记内部/私有属性。就像在 python 中,为变量添加下划线是一种简单的方法,可以告诉开发人员一个变量是内部的,他们最好不要篡改它(如果他们这样做了,即使是对所涉及的库的微小更新也可能会破坏事情)。

    【讨论】:

      【解决方案5】:

      通常_ 用于告诉用户/程序员它是有问题的私有/受保护变量。

      【讨论】:

        【解决方案6】:

        这是一个小附录。正如已经回答的那样,这些是伪私有变量。但是可以编写访问这些私有变量的伪公共函数。

        我被同事的代码弄糊涂了,它实际上有这个(但埋在一个单独的库中很深):

        class x { 
          constructor(id) {this._id = id} 
          get id() {return this._id}
        }
        let y = new x(3)
        

        现在y.idy._id 都可以工作并返回相同的值。但是,如果您使用console.log(y),它只会显示_id 键。

        【讨论】:

          【解决方案7】:

          如前所述,这是许多开发人员的一种做法,但这种做法很糟糕。如果你必须在你的编程方法中使用这样的约定,那么你应该在尝试使用该语言之前学习语言、方法和模式。如果有人在不使用“下划线”的情况下无法区分代码中的公共/私有方法,那么您的文档技能非常缺乏。 Web 上的许多公共项目的文档记录都很差,这可能就是为什么“下划线”约定被大多数受过教育的开发人员“接受”而其他人决定顺其自然而不是保持正式的设计模式和方法的原因。 “下划线”没有写入 ES6/7 版本是有原因的。

          在一篇博客中,我最近遇到了一位软件工程师经理,他说:“下划线命名约定可以很容易地一目了然地判断变量函数是公共的还是私有的。 em>”。我的回答是:“评论就像图片,在这种情况下,它们值一千个下划线。

          有一个名为 Doxygen 的免费文档工具。虽然它不专门支持 JavaScript,但当您在 ​​cmets 中使用 Doxygen 前缀时,它可以为您的 JavaScript 应用程序生成专业文档。当您在代码 cmets 中投入一点精力时,为开发人员和用户创建带有文档的 JavaScript 应用程序真的很简单。

          请记住,有一些工具可以删除 cmets,以及用于“生产版本”的控制台语句。话虽如此,使用源地图也是浪费时间和资源。在准备好发布之前不要缩小。即 Dev Build(不缩小,保留 cmets 和控制台语句),Release Build(删除 cmets 和控制台语句并缩小 Dev 构建。发布时无需重新编译 Dev Build质量代码,只需准备发布并部署它)。

          【讨论】:

          • 除非您查看函数的源代码,否则您不会看到评论。如果您使用的是其他人的库/代码,它会增加一些价值,以便能够在不阅读源代码或文档的情况下查看方法的意图。 Imo 下划线前缀表示它是一个不应该依赖的非公共 API。
          猜你喜欢
          • 1970-01-01
          • 2021-09-20
          • 2011-02-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-07
          • 1970-01-01
          相关资源
          最近更新 更多