关于作用域:javascript中属性和方法名称的下划线前缀

Underscore prefix for property and method names in JavaScript

javascript中的下划线前缀是否只是一种约定,例如在python私有类方法中?

从2.7 python文档中:

"Private" instance variables that
cannot be accessed except from inside
an object don’t exist in Python.
However, there is a convention that is
followed by most Python code: a name
prefixed with an underscore (e.g.
_spam) should be treated as a non-public part of the API (whether it
is a function, a method or a data
member).

这也适用于javascript吗?

以这个javascript代码为例:

1
2
3
4
5
6
7
8
9
function AltTabPopup() {
    this._init();
}

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

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

1
2
3
4
5
6
    ...
    this._currentApp = 0;
    this._currentWindow = -1;
    this._thumbnailTimeoutId = 0;
    this._motionTimeoutId = 0;
    ...

只有约定?或者下划线前缀后面还有更多内容?

我承认我的问题与这个问题非常相似,但它并没有让人更聪明地理解javascript中下划线前缀的重要性。


那只是个惯例。javascript语言对以下划线字符开头的标识符没有任何特殊意义。

也就是说,对于不支持开箱即用封装的语言来说,这是一个非常有用的约定。虽然没有办法防止有人滥用你的类的实现,但至少它确实澄清了你的意图,并且首先记录了错误的行为。


Javascript实际上支持封装,通过一种在闭包中隐藏成员的方法(crockford)。这就是说,有时候很麻烦,而且下划线约定是一个很好的约定,可以用来处理一些私人事务,但实际上不需要隐藏。


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


"Only conventions? Or is there more behind the underscore prefix?"

除了隐私约定,我还想帮助人们认识到下划线前缀也用于依赖独立参数的参数,特别是在URI锚定映射中。依赖键始终指向地图。

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

1
2
3
4
5
6
7
$.uriAnchor.setAnchor({
  page   : 'profile',
  _page  : {
    uname   : 'wendy',
    online  : 'today'
  }
});

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

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

这是一种用于根据哈希更改驱动应用程序状态的约定。


import/export现在正与ES6合作。如果我的大部分函数是导出的,我仍然倾向于用_给未导出的函数加前缀。

如果只导出一个类(如在角度项目中),则根本不需要它。

1
2
3
4
5
6
7
8
9
10
11
12
13
export class MyOpenClass{

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

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

}

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