为什么有些属性名称在JavaScript中以双下划线开头?

Sae*_*ati 37 javascript double-underscore

我看到JavaScript中某些对象的某些属性以双下划线开头.例如,像__defineGetter____defineSetter____proto__.它是一个常规定义的ECMAScript规范吗?或者它可能只是开发人员社区的惯例?

Ale*_*ird 31

这些是由特定浏览器定义的属性,不是由ECMAScript定义的.

因此,需要避免名称冲突.如果他们调用了该属性defineGetter,则无法保证该网站的代码尚未使用相同的名称定义属性 - 这将导致许多问题.但是,附加两个下划线已成为定义浏览器特定属性的实际方法(因为某些网站使用该约定的可能性要小得多).

您可能会注意到其他浏览器开始使用与其他浏览器相同的命名约定(如使用__proto__),但在所有浏览器之间仍然没有普遍保证(例如,IE没有定义__proto__ property).

另外:使用两个下划线表示"系统定义"标识符(而不是程序员定义的标识符)的惯例可以追溯很长一段时间,因此我不知道该约定何时"开始" - 至少与C++一样长(见http://en.wikipedia.org/wiki/Name_mangling#Simple_example)

  • 我不认为框架如何定义变量有一个总体惯例.然而,"最佳实践"是仅定义1个全局对象(如`google`对象或`jQuery`对象),然后在该对象的范围内定义所有方法/变量.这就是为了避免名称冲突的问题.但是,这绝不意味着每个框架都是这样做的. (2认同)

Ali*_*tad 5

这样就不太可能发生名称冲突.

JavaScript在全局命名空间中存在此问题,每个人都可以更改或访问任何内容 有一些数据隐藏技术,但有时不起作用.

例如,如果您这样做,您的jquery将停止工作:

$ = "somethingElse";
Run Code Online (Sandbox Code Playgroud)

  • 使用两个下划线表示"系统定义的"变量,而不是用户定义的变量可以追溯很长一段时间,因此我不知道该约定何时"开始" - 至少与C++一样长(参见http:// en. wikipedia.org/wiki/Name_mangling#Simple_example) (3认同)

zyp*_*510 5

我相信答案需要更新。这些名称现在是 ECMA-262 的一部分,所以是的,命名约定现在在 ECMAScript 规范中定义

从 ECMAScript 2015 (ES6) 开始,以下内容已标准化*:

从 ECMAScript 2017 (ES8) 开始,以下内容已标准化*:

*:但是应该注意的是,上面列出的部分都在附件 B“Web 浏览器的附加 ECMAScript 功能”中定义,附件 B 附带的注释如下(强调我的)

本附件描述了基于 Web 浏览器的 ECMAScript 实现的各种遗留功能和其他特征。本附件中规定的所有语言特征和行为都具有一种或多种不良特征,并且如果没有遗留使用,将从本规范中删除。然而,大量现有网页对这些功能的使用意味着网络浏览器必须继续支持它们。本附件中的规范定义了这些遗留功能的可互操作实现的要求。

这些功能不被视为核心 ECMAScript 语言的一部分。程序员在编写新的 ECMAScript 代码时不应使用或假设这些功能和行为的存在。不鼓励ECMAScript实现实现这些功能,除非该实现是 Web 浏览器的一部分,或者需要运行 Web 浏览器遇到的相同旧版 ECMAScript 代码。

有效地反对它们的使用。