下划线前缀在JavaScript中只是一种约定吗,就像在Python私有类方法中一样?

来自2.7 Python文档:

“私有”实例变量 只能从内部进入 对象在Python中不存在。 然而,有一个惯例是这样的 后跟大多数Python代码:一个名称 以下划线作为前缀(例如 _spam)应该被视为API的非公开部分(不管它是 函数、方法还是数据 成员)。

这也适用于JavaScript吗?

以下面的JavaScript代码为例:

function AltTabPopup() {
    this._init();
}

AltTabPopup.prototype = {
    _init : function() {
        ...
    }
}

此外,还使用下划线前缀变量。

    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

唯一的约定吗?或者下划线前缀后面还有更多?


我承认我的问题与这个问题非常相似,但它并没有使人们更聪明地认识到JavaScript中下划线前缀的重要性。


当前回答

JavaScript实际上支持封装,通过在闭包中隐藏成员的方法(Crockford)。也就是说,它有时很麻烦,下划线约定是一个很好的约定用于私有的东西,但实际上你不需要隐藏。

其他回答

这只是惯例。Javascript语言没有为以下划线开头的标识符赋予任何特殊含义。

也就是说,对于不支持开箱即用封装的语言来说,这是一个非常有用的约定。虽然没有办法阻止某人滥用类的实现,但至少它阐明了您的意图,并将此类行为记录为错误的。

JSDoc 3允许您使用@access private标记(以前是@private标记)注释您的函数,这对于向其他开发人员传播您的意图也很有用—http://usejsdoc.org/tags-access.html

导入/导出现在在ES6中做这项工作。如果我的大部分函数都导出了,我仍然倾向于在未导出的函数前面加上_。

如果你只导出一个类(比如在angular项目中),它根本就不需要。

export class MyOpenClass{

    open(){
         doStuff()
         this._privateStuff()
         return close();
    }

    _privateStuff() { /* _ only as a convention */} 

}

function close(){ /*... this is really private... */ }

“唯一的约定吗?或者下划线前缀后面还有其他含义?”

除了隐私约定之外,我还想帮助大家认识到,下划线前缀也用于依赖于独立参数的参数,特别是在URI锚点映射中。依赖键总是指向一个映射。

示例(来自https://github.com/mmikowski/urianchor):

$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

浏览器搜索字段的URI锚被更改为:

\#!page=profile:uname,wendy|online,today

这是一种约定,用于基于散列更改驱动应用程序状态。

JavaScript实际上支持封装,通过在闭包中隐藏成员的方法(Crockford)。也就是说,它有时很麻烦,下划线约定是一个很好的约定用于私有的东西,但实际上你不需要隐藏。