在Javascript中,这个下划线是什么意思?

时间:2011-11-27 20:26:19

标签: javascript oop backbone.js

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)为什么要使用它们?

7 个答案:

答案 0 :(得分:145)

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

不应该在课堂外调用它们。

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

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

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

答案 1 :(得分:21)

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

这里简要讨论过,但建议他们反对: http://javascript.crockford.com/code.html

答案 2 :(得分:8)

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

需要注意的一些事项,在这个使用_.varname的特定示例中,将使用underscore.js库表示变量或函数。也可以使用_varname来表示包含下划线对象的变量,类似于我们的办公室,我们使用$varname来表示包含Jquery对象的变量。

答案 3 :(得分:4)

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

答案 4 :(得分:2)

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

答案 5 :(得分:0)

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

在博客中,我最近遇到了一位软件工程师经理,他说:" 下划线命名约定使得一目了然,变量函数是公开的还是私有的非常简单&#34 ;.我的回答是:"评论就像图片一样,在这种情况下,它们值得一千个下划线。

有一个名为Doxygen的免费文档工具。虽然它不专门支持JavaScript,但是当您在评论中使用Doxygen前缀时,它可以为您的JavaScript应用程序生成专业文档。使用文档创建JavaScript应用程序非常简单,对于开发人员和用户来说,当您在代码注释中付出一些努力时。

请记住,有些工具可以删除"生产版本"的注释和控制台语句。话虽这么说,使用源地图也浪费时间和资源。不要缩小,直到准备发布..即Dev Build(没有缩小,保留注释和控制台语句),Release Build(删除注释和控制台语句并缩小Dev构建。无需重新编译Dev Build时它的发布质量代码,只需准备发布并部署它。)

答案 6 :(得分:0)

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

我对一个有效地具有此功能的同事代码感到困惑(但很深地埋在一个单独的库中):

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

现在,您同时拥有y.idy._id并返回相同的值。但是,如果您执行console.log(y),则只会显示_id键。

enter image description here