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


85
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();
    },

我在这里阅读有关ribs.js的教程:http : //addyosmani.com/blog/building-spas-jquerys-best-friends/

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


2
下划线没有句法含义,对于特定的程序员来说,可能要
习惯于

Answers:


164

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

不应在类之外调用它们。

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

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

注意:需要特别注意的是,仅向变量添加下划线并不能使其私有,这只是命名约定。


4
至少,存在私有字段的概念,但是它们并不是真正的私有的,您仍然可以访问它们。上面代码的作者只是希望它们私有。就这样。
桑德

太棒了,不知道为什么我花了这么长时间才看到它!谢谢。
droid-zilla 2015年

21

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

尽管不建议使用它们,但在此处进行了简要讨论:http : //javascript.crockford.com/code.html


3
我喜欢链接:“避免显示缺乏能力的约定。” :-)
Arek

我在调试时将它们用作快捷方式,尤其是在Promises和其他异步内容中。例如,访问对象的某些属性的“官方”方法可能是,myObj.getSmePromise().then( function(o) { do stuff } );但是在Chrome控制台上键入该命令很麻烦,因此我开始myObj._someValue理解“适当的代码”实际上不会访问它-但是,使用如果您正在编写下一个jQuery / lodash / angular / react或其他我不依赖您的所有用户的新知识,我的同事也都会知道该约定!
FredL

8

_varname这样使用时,它只是变量名称的一部分,没有javascript的含义。开发人员使用它来表示变量的含义或范围。在这种情况下,似乎告诉开发人员此变量应该是局部变量或私有变量。

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


4

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



0

如前所述,这在许多开发人员中都是一种做法,这是一个不好的做法。如果必须在编程方法中采用此类约定,则在尝试使用该语言之前,应学习该语言,方法和模式。如果有人在不使用“下划线”的情况下无法区分代码中的公共/私有方法,那么您的文档编制技能将非常缺乏。Web上的许多公共项目的文档记录都很少,这可能就是为什么大多数受过良好教育的开发人员“接受”“下划线”约定而其他人则决定遵循流程而不是保留正式的设计模式和方法的原因。有一个原因未将“下划线”写入ES6 / 7版本。

我最近在一个博客中遇到一位软件工程师经理,他说:“下划线命名约定使我们一眼就能知道变量函数是公开的还是私有的。 ” 我的回答是:“评论就像图片,在这种情况下,它们值得一千个下划线。

有一个名为Doxygen的免费文档工具。尽管它不专门支持JavaScript,但是当您在注释中使用Doxygen前缀时,它可以为您的JavaScript应用程序生成专业文档。当您在代码注释上稍加努力时,为开发人员和用户创建带有文档的JavaScript应用程序确实非常简单。

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


2
除非您正在查看函数的源代码,否则您不会看到注释。如果您使用的是别人的库/代码,那么它会增加一些值,以便能够在不阅读源代码或文档的情况下查看方法的意图。Imo下划线前缀表示这是不应该依赖的非公开API。
Sam P

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密钥。

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.