当我在我的变量或函数上面添加注释@private
时,它实际上在做什么?我查看了文档,但我仍然不确定。
goog.provide('myproject');
/** @private */
myproject.foo = "bar";
当我打开chrome的开发工具(myproject.foo)时,我仍然可以访问它。和...
goog.require('myproject');
window.addEventListener('load', function() {
//this works.
document.body.textContent = myproject.foo;
});
上面的代码仍然将body的textContent设置为等于“bar”,即使在编译时也是如此。那么@private
实际上做了什么?
答案 0 :(得分:5)
访问控制注释@private
,@protected
和@public
是
Closure Compiler的指令,帮助开发人员执行
所需的属性和功能可见性水平。
要发出访问冲突警告,请使用Compiler标志:
要为访问冲突发出错误,请使用Compiler标志:
基于每个文件强制执行访问控制注释,
意味着注释@private
或@protected
的任何属性都可能是
访问同一文件中的任何位置。另请注意,编译器会删除
来自编译代码的这些注释,因为它们不是
JavaScript语言。
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.
goog.provide('ns2');
goog.require('ns1');
alert('ns1.global = ' + ns1.global); // Not allowed.
ns2.instance2 = new ns1.Constructor();
alert(ns2.instance2.secret_); // Not allowed.
设置了标志--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_);
^
请参阅 Google JavaScript中的Visibility (private and protected fields) 风格指南。
答案 1 :(得分:1)
cpeisert在他的回答中暗示了这一点,但只是为了明确:这些可见性注释根本不会修改你的输出。
将函数标记为@private不会隐藏它或使得它在结果代码中的访问权限比编译器通常要少,并且您在运行时引入的任何第三方代码都将能够调用此类函数。
这些注释提供的唯一访问保护是针对您使用它们编译的代码。