2

请看这个

左边的“原始文本”工作完美,右边的“更改文本”给我错误

未捕获的语法错误:意外的令牌} MapModule.js:34

未捕获的类型错误:无法调用未定义的 localhost/:103(匿名函数)localhost/:103 的方法“初始化”

我不明白有什么区别。

如果您想知道我是如何修改文件的,这很简单,我只是从 Aptana 3 source->format 中使用...

4

3 回答 3

2

这是因为 JavaScript 的自动分号插入 (ASI) 会在某些语句以换行符结束时插入分号。您可以在这个SO question中了解它。

在您的情况下,代码在 return 语句中有一个换行符,将插入一个分号。这意味着:

return 
{
   initialize: initialize,
};

.. 将变为以下内容:

return;
{
   initialize: initialize,
};
// will now always return undefined

未捕获的语法错误:意外的令牌} MapModule.js:34

此错误是因为您在对象文字内有一个尾随逗号:

return {
    initialize: initialize, // <-- whoops
}

这在大多数 JS 引擎中实际上是合法的……除了 IE。令人惊讶的是,这是 IE 根据规范所做的一件事。:-) 要解决此问题,请避免使用尾随逗号:

return {
    initialize: initialize // FIXED
}

希望这可以解决一些问题。

于 2013-06-03T11:07:09.383 回答
2

你破坏了return陈述。您不能在return语句之后的下一行开始对象文字,因为解析器会感到困惑。换句话说,您必须将 与{放在同一行。return

该问题涉及有问题且有争议的 JavaScript“分号插入”规则。

原始代码还在对象文字的末尾包含一个杂散的逗号。那应该被删除。

于 2013-06-02T16:57:22.263 回答
0

return 语句期望您要返回的值在同一行中。所以这:

return {
   a:1
};

可以正常工作,而这:

return
{
    a:1
};

会回来undefined,因为后面什么都没有return。剩下的是这个声明:

{
    a:1
};

这实际上是一个不应产生任何错误的有效语句。正如 Spoike 和 Bergi 已经提到的那样,您收到一个语法错误,因为后面有一个尾随逗号,a:1这表明在 property 后面应该有另一个属性a,但该属性不存在。

顺便提一句。这是 Doug Crockford 的视频的链接,它解释了这个案例以及为什么{a:1};是一个有效的声明:http ://www.youtube.com/watch?v=hQVTIJBZook#t=30m38s

于 2013-06-02T17:00:50.550 回答