2012-07-07 55 views
4

我试图编译我的JS代码在google closure compiler,我对这个代码得到错误与对象

var settings = { 
       providers: ['A', 'B', 'C'], 
       interface: 'basic16', 
       apikey: 'XXXXX-XXXXX-XXXXX-XXXXXXXXXX' 
       } 

错误是

JSC_PARSE_ERROR: Parse error. invalid property id at line 3 character 10 
interface: 'basic16', 
     ^
JSC_PARSE_ERROR: Parse error. syntax error at line 3 character 11 
interface: 'basic16', 
     ^
JSC_PARSE_ERROR: Parse error. syntax error at line 4 character 8 
apikey: 'XXXXX-XXXXX-XXXXX-XXXXXXXXXX' 
     ^

Closure编译器的问题,但此代码的工作非常适合我任何浏览器(铬,火狐,歌剧,Safari浏览器,IE7,8,9)

+5

“接口”似乎是一个保留供将来使用的关键字,请参阅https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words - 将标识符用引号引起来,你应该没问题。 – Niko 2012-07-07 10:51:36

+1

@妮科 - 你是对的,所以你应该把它作为答案! – 2012-07-07 10:53:05

+0

你确定它在IE8中有效吗?根据[Kangax compat table](http://kangax.github.com/es5-compat-table/)作为属性名称的保留字应该在IE8中引发错误。 – 2012-07-07 10:56:26

回答

7

MDN指出关键字interface保留供将来使用,不得用于公关操作符/函数/变量名称。

https://developer.mozilla.org/en/JavaScript/Reference/Reserved_Words

事情是,该MDN还指出,该关键字的使用严格模式时,只限制。所以我不太确定封闭编译器是否在做出正确的事情,即使在非严格模式下也是如此。这看起来更像是一个错误,但最好避免使用这些关键字。

然而,一个解决方案是简单包裹在引号标识符:

var settings = { 
    providers: ['A', 'B', 'C'], 
    'interface': 'basic16', 
    apikey: 'XXXXX-XXXXX-XXXXX-XXXXXXXXXX' 
}; 
3

的EcmaScript 3不允许关键字和保留关键字作为属性名称。 Ecmascript 5解除了这个限制(它们仍被禁止作为变量和函数名称)。但是,编译器默认使用ecmascript 3模式。

+0

沿着这些线,添加'--language_in ECMASCRIPT5'命令行选项为我工作。 – cyberhobo 2013-11-13 21:45:04

+0

如果您使用最新版本,这些应该不再是错误,而是警告。在ES3模式下,编译器会将关键字属性引用重写为引用的访问权限:foo.interface变为foo ['interface']。 – John 2013-11-16 00:38:09