@private注释在Google Closure JavaScript代码中实际做了什么?

Zau*_*ucy 6 javascript annotations google-closure google-closure-library google-closure-compiler

当我在我的变量或函数上面添加注释时,@private它实际上在做什么?我查看了文档,但我仍然不确定.

goog.provide('myproject');

/** @private */
myproject.foo = "bar";
Run Code Online (Sandbox Code Playgroud)

当我打开chrome的开发工具(myproject.foo)时,我仍然可以访问它.和...

goog.require('myproject');

window.addEventListener('load', function() {
    //this works.
    document.body.textContent = myproject.foo;
});
Run Code Online (Sandbox Code Playgroud)

即使在编译时,上面的代码仍将body的bodyContent设置为等于"bar".那@private实际上做了什么?

Chr*_*ert 6

访问控制的注释@private,@protected以及@public对于该关闭编译器,帮助开发者强制执行的知名度的性质和功能所需水平的指令.

要发出访问冲突警告,请使用Compiler标志:

  • --jscomp_warning =知名度

要为访问冲突发出错误,请使用Compiler标志:

  • --jscomp_error =知名度

访问控制注释基于每个文件强制执行,这意味着在同一文件中的任何位置都可以注释@private@protected访问任何属性.另请注意,编译器会从已编译的代码中删除这些注释,因为它们不是JavaScript语言的一部分.

file1.js

goog.provide('ns1');

/**
 * Global private variable.
 * @private
 */
ns1.global = 'foo';
alert('ns1.global = ' + ns1.global); // OK in same file.


/** @constructor */
ns1.Constructor = function() {
  /** @private */
  this.secret_ = ns1.global;
};

ns1.instance = new ns1.Constructor();
alert(ns1.instance.secret_); // No warning in same file.
Run Code Online (Sandbox Code Playgroud)

file2.js

goog.provide('ns2');

goog.require('ns1');

alert('ns1.global = ' + ns1.global); // Not allowed.

ns2.instance2 = new ns1.Constructor();
alert(ns2.instance2.secret_); // Not allowed.
Run Code Online (Sandbox Code Playgroud)

--jscomp_error=visibility设置标志后,Closure Compiler会发出以下错误.

ERROR - Access to private property global of ns1 not allowed here.
alert('ns1.global = ' + ns1.global);
                        ^
ERROR - Access to private property secret_ of ns1.Constructor not allowed here.
alert(ns2.instance2.secret_);
      ^
Run Code Online (Sandbox Code Playgroud)

请参阅Google JavaScript样式指南中的可见性(私有和受保护字段).

  • @Saucy,要获得可见性错误/警告,还需要设置`--compiler_flags =" - warning_level = VERBOSE"` (2认同)